Segfault和/或“;致命错误:未知:需要打开失败";运行CIFS装载中的脚本时


Segfault and/or "Fatal error: Unknown: Failed opening required..." when running scripts located in CIFS mounts

我编译了PHP 5.4.22和5.5.6。在这两个版本中,我都无法运行位于CIFS(SMB/Samba)装载中的任何脚本。

如果我尝试以通常的方式运行它,我会收到一条奇怪的错误消息:

user@machine:/mnt/windows# /opt/php/bin/php test.php
Fatal error: Unknown: Failed opening required 'test.php' (include_path='.:/opt/php/lib/php') in Unknown on line 0

如果我尝试使用内置服务器,我只会遇到一个分段错误:

user@machine:/mnt/windows# /opt/php/bin/php -S 0.0.0.0:8000
PHP 5.5.6 Development Server started at Thu Dec  5 23:04:53 2013
Listening on http://0.0.0.0:8000
Document root is /smb
Press Ctrl-C to quit.
--------> here I load the website from a browser <--------
Segmentation fault

由于某种原因,挂载文件夹中的inode数量很大,这让PHP抓狂:

user@machine:/mnt/windows# ls -i test.php
69524319247729677 -rwxrwxrwx 1 65535 65535 26 Dec  4 23:28 test.php

它看起来像是CIFS的一个功能:

UniqueID值在整个服务器的范围内是唯一的,并且通常大于2的幂32。该值通常会使未使用LFS(大文件支持)编译的程序触发glibc EOVERFLOW错误,因为这不适合目标结构字段。强烈建议编译支持LFS的程序(即使用-D_FILE_OFFSET_BITS=64)以防止出现此问题您还可以使用"noserverino"装载选项在客户端上生成小于2幂32的索引节点号。但您可能无法正确检测硬链接。

因此,我将noserverino添加到/etc/fstab中的装载选项中。完成后,重新安装inode编号会变得更好,一切都完美无瑕:

user@machine:/mnt/windows# ls -i test.php
89 -rwxrwxrwx 1 65535 65535 26 Dec  4 23:28 test.php
user@machine:/mnt/windows# /opt/php/bin/php test.php
hello world

似乎有一个与PHP相关的错误,但它似乎对性能和其他功能有一些副作用。


更新:执行此操作后,除了服务器无法发送大于几十KB的文件外,其他一切似乎都正常。。所以我们又回到了原点。