带有 IMAP 的 PHP CLI,启动延迟 5 秒

带有 IMAP 的 PHP CLI,启动延迟 5 秒

在 RedHat Enterprise 6.5 服务器上安装了“php-imap-5.3.3-27.el6_5.x86_64”后,PHP 的 CLI 版本总是需要 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

答案1

这不是一个完整的答案......但是观察输出:

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 查找?

相关内容