ます’s Blog - どうでもいい記事100選

どうでもいい記事100選

続続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

        〜 省略 〜