簡體   English   中英

所有流浪的PHP CLI腳本都在Mac OS X上等待主機解析

[英]All vagrant PHP CLI scripts hang waiting on host resolution on Mac OS X

在運行Ubuntu的Homestead vagrant盒子上執行PHP命令時,我一直在掛起。 在控制台甚至啟動php cli執行之前有一個顯着的延遲。

Ran strace -vyT -S time php artisan help從流浪者的盒子。 在第一次到最后一次調用recvfrom(3 ,所有東西都會卡住幾分鍾recvfrom(3 ,但我不明白為什么:

open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3 <0.000010>
fstat(3</run/resolvconf/resolv.conf>, {st_dev=makedev(0, 16), st_ino=7632, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=171, st_atime=2015/10/17-04:53:56, st_mtime=2015/10/17-04:53:54, st_ctime=2015/10/17-04:53:54}) = 0 <0.000007>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fed9385c000 <0.000008>
read(3</run/resolvconf/resolv.conf>, "# Dynamic resolv.conf(5) file fo"..., 4096) = 171 <0.000010>
read(3</run/resolvconf/resolv.conf>, "", 4096) = 0 <0.000006>
close(3</run/resolvconf/resolv.conf>)   = 0 <0.000008>
munmap(0x7fed9385c000, 4096)            = 0 <0.000011>
uname({sysname="Linux", nodename="homestead", release="3.13.0-65-generic", version="#106-Ubuntu SMP Fri Oct 2 22:08:27 UTC 2015", machine="x86_64", domainname="(none)"}) = 0 <0.000006>
stat("/etc/resolv.conf", {st_dev=makedev(0, 16), st_ino=7632, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=171, st_atime=2015/10/17-04:53:56, st_mtime=2015/10/17-04:53:54, st_ctime=2015/10/17-04:53:54}) = 0 <0.000008>
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 3 <0.000009>
fstat(3</etc/hosts>, {st_dev=makedev(8, 1), st_ino=1161, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=251, st_atime=2015/10/16-18:57:29, st_mtime=2014/10/03-01:16:42, st_ctime=2014/10/03-01:16:42}) = 0 <0.000005>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fed9385c000 <0.000008>
read(3</etc/hosts>, "127.0.0.1 localhost\n\n# The follo"..., 4096) = 251 <0.000009>
read(3</etc/hosts>, "", 4096)           = 0 <0.000007>
close(3</etc/hosts>)                    = 0 <0.000007>
munmap(0x7fed9385c000, 4096)            = 0 <0.000010>
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3 <0.000012>
fcntl(3<socket:[78362]>, F_SETFL, O_RDONLY|O_NONBLOCK) = 0 <0.000006>
connect(3, {sa_family=AF_INET, sin_port=htons(9000), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress) <0.000094>
select(4, [3<socket:[78362]>], [3<socket:[78362]>], [3<socket:[78362]>], {0, 200000}) = 1 (out [3], left {0, 199997}) <0.000010>
getpeername(3, {sa_family=AF_INET, sin_port=htons(9000), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 <0.000007>
fcntl(3<socket:[78362]>, F_SETFL, O_RDONLY) = 0 <0.000006>
setsockopt(3, SOL_TCP, TCP_NODELAY, "\1\0\0\0\0\0\0\0", 8) = 0 <0.000008>
write(3<socket:[78362]>, "478\0<?xml version=\"1.0\" encoding"..., 483) = 483 <0.000042>
brk(0x2f93000)                          = 0x2f93000 <0.000472>
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <4.940291>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.072574>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.033758>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.038904>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.026003>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.024057>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.055221>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.058240>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.027569>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.056877>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.025934>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.076699>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.089092>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.254680>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.131634>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.065721>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.042778>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.072277>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.044424>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <0.080704>
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = -1 ECONNRESET (Connection reset by peer) <113.777721>

這是/etc/hosts的內容:

127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
127.0.1.1 homestead homestead

/etc/resolve.conf的內容:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.0.2.3

問題是現在影響我所擁有的每個無關的流浪者盒子,而不僅僅是Homestead盒子。 對於每個CLI執行,幾乎每個盒子上的每個PHP命令都會停止5-15分鍾。 如果必須調用一系列命令,則可能需要一個小時才能完成一個需要30秒的過程。

在Mac運行之后,這些盒子運行升級為El Capitan。

根據流浪者的盒子,有時這個strace線:

connect(3, {sa_family=AF_INET, sin_port=htons(9000), sin_addr=inet_addr("127.0.0.1")}, 16) = 0

替換為:

connect(3, {sa_family=AF_INET, sin_port=htons(9000), sin_addr=inet_addr("192.168.56.1")}, 16) = 0

IP 192.168.56.1似乎是VirtualBox的默認路由器。

請注意,所有流浪盒都是標准配置或在我的其他團隊成員的Mac / Windows系統上沒有問題的那些。

Vagrant 1.7.4和VirtualBox 4.3.30。

響應請求route -n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1

結果為sudo netstat -tulnp | grep 9000 sudo netstat -tulnp | grep 9000

tcp6       0      0 :::9000                 :::*                    LISTEN      1317/hhvm

為什么hhvm出現,我不知道,因為該框應該使用標准的PHP解釋器。

問題似乎與主機名解析有關。 如果你正在嘗試使用你的IP而不是localhost ip 127.0.0.1 最好在/etc/hosts使用,例如:

yourip  hostname.example.com hostname

例如

10.0.2.20 test.example.com test

並刪除/etc/hosts相關的localhost或最后保留。 系統將嘗試進入第一個條目,如果您不使用ipv6那么您也可以刪除ipv6相關條目。

編輯:你的/etc/resolv.conf文件應該有下面的行

nameserver 127.0.0.1

還添加了vagrant默認網絡,因為你的輸出顯示它試圖連接但是如果你不想使用那么你可以跳過。 你使用的是127.0.0.1所以至少它應該在那里。你可以從這里這里獲得幫助。

tl;博士 :我責備xdebug客戶端。 嘗試在Ubuntu上禁用xdebug。

我的理由

我沒有在strace日志中看到主機解析有任何問題。

它首先檢查/etc/resolv.conf ,然后檢查/etc/hosts並連接到127.0.0.1:9000 connect(3, {sa_family=AF_INET, sin_port=htons(9000), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress) <0.000094>

端口9000是xdebug的默認設置,除非在/etc/php5/mods-available/xdebug.ini重新定義或類似。

write(3<socket:[78362]>, "478\\0<?xml version=\\"1.0\\" encoding"..., 483) = 483 <0.000042>看起來像是從xdebug擴展發送到客戶端的消息。

等待2分鍾recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS 然后recvfrom(3, 0x7ffc489b16d0, 128, 0, 0, 0) = ? ERESTARTSYS放棄並執行你的php腳本。

自v2.2.4起,等待時間減少到200毫秒: https//github.com/xdebug/xdebug/pull/90

假設禁用xdebug解決了問題,幾乎沒有選項:

  • 升級xdebug
  • 將xdebug配置為僅使用xdebug.remote_autostart=off按需啟動
  • 繼續啟用/禁用xdebug
  • 始終保持xdebug客戶端正常運行,並確保端口正確映射,並且不會掛起

那感覺就像是一個DNS問題。 我的猜測是你的機器無法通過給定的主機名解析DNS,或者DNS服務器只是很慢。 我的建議是在本地安裝緩存DNS服務器,然后使用它,並將/ etc / hosts文件添加到專用網絡中的任何內容,這些文件將不會從DNS提供。 使用NetworkManager或您必須添加127.0.0.1作為可行(和首選)DNS服務器的網絡服務,事情應該順利進行。 如果您使用的是ubuntu,那應該像sudo apt-get install bind9一樣簡單。

如果你想診斷問題,首先安裝dnsutils,以獲取dig和nslookup,並嘗試查詢某些內容,例如www.google.co.uk,查看需要多長時間以及哪個服務器具有權威性。 然后嘗試使用dig,更具體地說,直接詢問服務器,直接詢問SOA,看看你是否可以找出最薄弱環節的位置。

它可能是一個通過DHCP將自己宣傳為DNS服務的路由器,但在按下時無法正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM