web-dev-qa-db-ja.com

PHP CLIとIMAP、5秒の起動遅延

RedHat Enterprise6.5サーバーに「php-imap-5.3.3-27.el6_5.x86_64」をインストールすると、CLIバージョンのPHPの実行には常に5秒かかります。

php -n -d extension=imap.so -v
PHP 5.3.3 (cli) (built: Dec  5 2013 07:09:40) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

real  0m5.023s
user  0m0.006s
sys   0m0.010s

「-n」は通常のphp.iniを無効にし、「imap.so」のみをロードすることに注意してください(デバッグ目的のみ)。

何がこれを引き起こしているのか分かりますか?何か、おそらくタイムアウトのために一時停止しているようですか?

SELinux監査ログには何も記載されていませんが、興味深いことに、ライブラリの読み込みが何らかの理由でDNSサーバーに接続しようとしている(失敗している?)ようです。

strace -s -c php -n -d extension=imap.so -v

  execve("/usr/bin/php", [...], [/* 24 vars */]) = 0
  brk(0)                                  = 0x15e2000

[...]

  socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
  connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.1.1")}, 16) = 0
  poll([...], 1, 0)                       = 1 ([...])
  sendto(3, ""..., 38, MSG_NOSIGNAL, NULL, 0) = 38
  poll([...], 1, 5000)                    = 1 ([...])
  sendto(3, ""..., 38, MSG_NOSIGNAL, NULL, 0) = 38
  poll([...], 1, 4999)                    = 1 ([...])
  ioctl(3, FIONREAD, [254])               = 0
  recvfrom(3, ""..., 2048, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.1.1")}, [16]) = 254
  poll([...], 1, 4998

[... 5 second pause ...]

  )                    = 0 (Timeout)
  poll([...], 1, 0)                       = 1 ([...])
  sendto(3, ""..., 38, MSG_NOSIGNAL, NULL, 0) = 38
  poll([...], 1, 5000)                    = 1 ([...])
  ioctl(3, FIONREAD, [254])               = 0
  recvfrom(3, ""..., 2048, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.1.1")}, [16]) = 254
  poll([...], 1, 4998)                    = 1 ([...])
  sendto(3, ""..., 38, MSG_NOSIGNAL, NULL, 0) = 38
  poll([...], 1, 4998)                    = 1 ([...])
  ioctl(3, FIONREAD, [97])                = 0
  recvfrom(3, ""..., 1794, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.1.1")}, [16]) = 97
  close(3)                                = 0
  alarm(0)                                = 0

[...]

Digに確認したところ、DNSは正常に応答しているようです。

Dig +short example.com @192.168.1.1
93.184.216.119

必須のstraceカウント出力について:

strace -c php -n -d extension=imap.so -v

PHP 5.3.3 (cli) (built: Dec  5 2013 07:09:40)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 27.14    0.000019           0       103           mmap
 25.71    0.000018           0        48           read
 25.71    0.000018           5         4           socket
 21.43    0.000015           0        47           fstat
  0.00    0.000000           0         1           write
  0.00    0.000000           0        49         2 open
  0.00    0.000000           0        51           close
  0.00    0.000000           0         6         2 stat
  0.00    0.000000           0         8           poll
  0.00    0.000000           0         1           lseek
  0.00    0.000000           0        54           mprotect
  0.00    0.000000           0        19           munmap
  0.00    0.000000           0        14           brk
  0.00    0.000000           0         4           rt_sigaction
  0.00    0.000000           0         6           rt_sigprocmask
  0.00    0.000000           0        12           ioctl
  0.00    0.000000           0         4         3 access
  0.00    0.000000           0         3           alarm
  0.00    0.000000           0         3         2 connect
  0.00    0.000000           0         5           sendto
  0.00    0.000000           0         3           recvfrom
  0.00    0.000000           0         3           recvmsg
  0.00    0.000000           0         1           bind
  0.00    0.000000           0         1           getsockname
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           uname
  0.00    0.000000           0         4           fcntl
  0.00    0.000000           0         1           getcwd
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0         1           statfs
  0.00    0.000000           0         1           Arch_prctl
  0.00    0.000000           0        11         1 futex
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.000070                   473        10 total

そしてltrace(かなりのmemcpy/free/memset時間):

ltrace -c php -n -d extension=imap.so -v

PHP 5.3.3 (cli) (built: Dec  5 2013 07:09:40)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

% time     seconds  usecs/call     calls      function
------ ----------- ----------- --------- --------------------
 41.92    7.377898         790      9331 memcpy
 32.32    5.689380         581      9788 free
 11.48    2.021224       14972       135 memset
  7.79    1.371877         147      9297 malloc
  2.86    0.503343         157      3191 strlen
  1.62    0.285582         147      1940 __ctype_tolower_loc
  0.84    0.147136         145      1010 strrchr
  0.37    0.065134         148       440 calloc
  0.21    0.036233         151       239 realloc
  0.14    0.024520       12260         2 getprotobyname
  0.12    0.020486       20486         1 dlopen
  0.07    0.012101         124        97 strcasecmp
  0.07    0.011930         142        84 strtol
  0.06    0.010258         170        60 strchr
  0.02    0.004310         172        25 _setjmp
  0.02    0.003569         148        24 __ctype_b_loc
  0.02    0.002862        2862         1 ERR_load_crypto_strings
  0.01    0.001339         148         9
  0.01    0.001298        1298         1 using_history
  0.01    0.001027         171         6 strncasecmp
  0.01    0.000898         898         1 dlclose
  0.01    0.000893         127         7 getenv
  0.00    0.000682         170         4 fflush
  0.00    0.000371         371         1 tzset
  0.00    0.000358         179         2 xmlParserInputBufferCreateFilenameDefault
  0.00    0.000354         354         1 ERR_load_ERR_strings
  0.00    0.000351         351         1 setlocale
  0.00    0.000346         173         2 xmlSetGenericErrorFunc
  0.00    0.000341         170         2 xmlOutputBufferCreateFilenameDefault
  0.00    0.000326         163         2 signal
  0.00    0.000326         163         2 __strtok_r
  0.00    0.000312         312         1 SSL_library_init
  0.00    0.000303         303         1 OpenSSL_add_all_ciphers
  0.00    0.000282         282         1 EVP_cleanup
  0.00    0.000253         253         1 xmlInitParser
  0.00    0.000245         245         1 OPENSSL_add_all_algorithms_noconf
  0.00    0.000224         224         1 write
  0.00    0.000223         223         1 sigprocmask
  0.00    0.000191         191         1 OpenSSL_add_all_digests
  0.00    0.000187         187         1 xmlCleanupParser
  0.00    0.000178         178         1 xmlSetStructuredErrorFunc
  0.00    0.000176         176         1 xmlRelaxNGCleanupTypes
  0.00    0.000175         175         1 ERR_load_EVP_strings
  0.00    0.000175         175         1 X509_get_default_cert_area
  0.00    0.000172         172         1 sigemptyset
  0.00    0.000171         171         1 xmlResetLastError
  0.00    0.000170         170         1 strncmp
  0.00    0.000169         169         1 time
  0.00    0.000169         169         1 sigaddset
  0.00    0.000167         167         1 SSL_get_ex_new_index
  0.00    0.000154         154         1 __gmp_set_memory_functions
  0.00    0.000153         153         1 pcre_version
  0.00    0.000151         151         1 gnu_get_libc_version
  0.00    0.000145         145         1 __xmlParserVersion
  0.00    0.000092          92         1 getcwd
  0.00    0.000079          79         1 dlsym
  0.00    0.000072          72         1 __strdup
------ ----------- ----------- --------- --------------------
100.00   17.601541                 35732 total

関連しているが、解決されていない:

http://superuser.com/questions/336177/running-php-as-cli-takes-a-long-time
http://trac.macports.org/ticket/35222
https://bugs.php.net/bug.php?id=41968
https://github.com/liip/php-osx/issues/102
3
Craig Francis

完全な答えではありません...しかし、以下からの出力を見てください:

tcpdump -vvv port 53

サーバーがホスト名を解決しようとしていることを示しました...Digがこれを解決できる間、何か(SELinux?)がphpをブロックしていると思いますか?

したがって、/etc/hostsファイルにエントリを追加します。

127.0.0.1   example.net

トリックをしたようです:

time php -n -d extension=imap.so -v
PHP 5.3.3 (cli) (built: Dec  5 2013 07:09:40) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

real  0m0.011s
user  0m0.007s
sys   0m0.003s

私はおそらくそれをそこに残すつもりです...しかしそれはまだ疑問を投げかけます、なぜそれはDNSルックアップを行うことができなかったのですか、そしてなぜライブラリは(使用されていなくても)DNSルックアップをしようとしたのですか?

3
Craig Francis