我们在将 PHP 文件上传到生产 NFS 服务器时遇到了一个问题,上传后我们开始收到 PHP 解析错误。“修复”它们的唯一方法是使用 vim 打开它们并通过 SSH 保存而不进行任何更改。这让我认为它可能与文件编码有关。我似乎找不到任何关于如何修复此问题的信息。
我们使用 FileZilla 通过 SFTP 上传文件。
到目前为止我们已经尝试过的事情:
- 检查每个人都使用无 BOM 的 UTF-8 编码编辑文件。
- 将 FileZilla 的文件传输类型更改为二进制(如果使用 SFTP,传输类型始终为二进制)。
错误示例:
ParseError: Uncaught exception 'ParseError' with message 'syntax error, unexpected '} '' in XXXXXX.php:XXXX
Uncaught exception 'ParseError' with message 'syntax error, unexpected ''] = '' (T_CONSTANT_ENCAPSED_STRING)' in XXXXX.php:XXXX
服务器信息:运行 NFS 的 AWS EC2 实例。NFS 由运行启用了 OPCache 的 Apache 和 PHP7 的多个自动扩展实例使用。
答案1
这是对可能原因的猜测。我对 NFS 内部操作了解不够多,无法准确描述问题,但我给出了有根据的猜测。
这可能是文件锁定/同步问题。PHP 进程可能会在上传期间从 NFS 服务器读取不完整的 PHP 文件,从而触发错误。NFS 客户端在上传完成时没有意识到文件已更改,因此它仍然使用客户端系统缓存中的不完整文件。
当你编辑文件并保存时,编辑器会在一个原子操作中读取和写入它。NFS 客户端现在看到文件状态已更改并从服务器读取它。
您可以尝试使用noac
NFS 客户端 mount 命令中的选项来禁用文件属性缓存。另一种方法是将actimeo=3
缓存时间设置为 3 秒。