続続TCPソケットな mysql_connect()について
kenji-uさんのトコから。
MySQLの起動していないホストに対して、mysql_connect()して確認してみてください。
ループで回している意味がありません。相当タチ悪いタイムアウトをしてくれます。結局、禁断のsystem() ping 打つしかないのかなぁ...。皆さん、どうしてるんでしょ?
結論(殆ど試していないので推論)から先に書くと、php.iniのエントリで「mysql.connect_timeout」を「1」とか短い数字にすれば良さげです。
手元の環境では若干ですが、connectエラーの応答が早くなった感じがします。何となくですが、設定値×2の秒くらい待っていたような気がします。
何はともあれ、一度お試しを。
以下は、PHPのソースを確認した結果です(予備録)。
最初はタコさんハックが必要かな?と思ったのですが、既に仕組みがあるようでした。
% less -N php4-STABLE-200707110230/ext/mysql/php_mysql.c 〜 省略 〜 355 STD_PHP_INI_ENTRY("mysql.connect_timeout", "60", PHP_INI_ALL, OnUpdateInt, connect_timeout, zend_mysql_globals, mysql_globals) 〜 省略 〜 371 mysql_globals->connect_timeout = 0; 〜 省略 〜 506 long connect_timeout; 507 508 509 connect_timeout = MySG(connect_timeout); 〜 省略 〜 670 #if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */ 671 mysql_init(&mysql->conn); 672 673 if (connect_timeout != -1) 674 mysql_options(&mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout); 675 676 if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) { 677 #else 678 if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) { 679 #endif 〜 省略 〜 776 #if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */ 777 mysql_init(&mysql->conn); 778 779 if (connect_timeout != -1) 780 mysql_options(&mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout); 781 782 if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) { 783 #else 784 if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) { 785 #endif 〜 省略 〜 % less -N php5.2-200707110230/ext/mysql/php_mysql.c 〜 省略 〜 362 STD_PHP_INI_ENTRY("mysql.connect_timeout", "60", PHP_INI_ALL, OnUpdateLong, connect_timeout, zend_mysql_globals, mysql_globals) 〜 省略 〜 378 mysql_globals->connect_timeout = 0; 〜 省略 〜 522 long connect_timeout; 523 524 525 connect_timeout = MySG(connect_timeout); 〜 省略 〜 699 #if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */ 700 mysql_init(&mysql->conn); 701 702 if (connect_timeout != -1) { 703 mysql_options(&mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout); 704 } 705 706 if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) { 707 #else 708 if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) { 709 #endif 〜 省略 〜 806 #if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */ 807 mysql_init(&mysql->conn); 808 809 if (connect_timeout != -1) { 810 mysql_options(&mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout); 811 } 812 813 if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) { 814 #else 815 if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) { 816 #endif 〜 省略 〜 % less -N php6.0-200707110230/ext/mysql/php_mysql.c 〜 省略 〜 356 STD_PHP_INI_ENTRY("mysql.connect_timeout", "60", PHP_INI_ALL, OnUpdateLong, connect_timeout, zend_mysql_globals, mysql_globals) 〜 省略 〜 372 mysql_globals->connect_timeout = 0; 〜 省略 〜 514 long connect_timeout; 515 516 517 connect_timeout = MySG(connect_timeout); 〜 省略 〜 618 #if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */ 619 mysql_init(&mysql->conn); 620 621 if (connect_timeout != -1) { 622 mysql_options(&mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout); 623 } 624 625 if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) { 626 #else 627 if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) { 628 #endif 〜 省略 〜 737 #if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */ 738 mysql_init(&mysql->conn); 739 740 if (connect_timeout != -1) { 741 mysql_options(&mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout); 742 } 743 744 if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) { 745 #else 746 if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) { 747 #endif 〜 省略 〜