我们最近将服务器从PHP 5.4.15升级到5.5.1并开始在日志中收到此错误
致命错误无法创建锁定文件:错误的文件描述符
我已经跟踪了这个代码,打开了另一个小PHP脚本,该脚本在后台将文件上传到S3。
// Grab uploaded file and assign a working name
$fileTemp = $_FILES['file']['tmp_name'];
$pathToWorkingFile = tempnam($g_TmpDirectory, "TR-");
// Move the file to our working area
if (move_uploaded_file($fileTemp, $pathToWorkingFile) === false)
throw new Exception("Cannot move file to staging area.", 1011);
// Where the file will end up on S3
$s3Bucket = "test.bucket.com";
$uploadDest = "/uploads/image123.jpg";
// Create process to upload file in background
popen("/usr/local/bin/php /path/to/uploadScript.php $pathToWorkingFile $s3Bucket $uploadDest &", 'r');
答案 0 :(得分:3)
事实证明,此错误是由我们在PHP升级过程中启用的OPcache配置引起的。通过从php.ini中删除此设置来禁用命令行操作时,一切正常。
opcache.enable_cli=1
答案 1 :(得分:2)
我能够使用opcache.enable_cli=1
解决,但对我来说,根本问题是MacOS中/tmp
目录的权限错误。
这就是我解决这个问题的方法:
sudo rm -Rf /tmp
sudo rm -Rf /private/tmp
sudo mkdir private/tmp
sudo chown root:wheel /private/tmp
sudo chmod 1777 /private/tmp
sudo ln -s /private/tmp /tmp
答案 2 :(得分:0)
如果您使用的是 Ubuntu,则您的 /tmp 权限已关闭。
当我尝试为 laravel 运行 php artisan serve
时,运行它修复了它。
运行:
chmod 1777 /tmp
您可能需要使用 sudo
。
在此处查看原始帖子:
答案 3 :(得分:0)
我在 Windows 的 php-cli 中获得了 Bad file descriptor
,因为我在 Windows 安全 → 病毒和威胁防护 → 中打开了 受控文件夹访问 设置勒索软件防护。
当我尝试从命令行运行 composer 时,它无法初始化,并给出了错误 -
[ErrorException]
file_put_contents(): Write of 111 bytes failed with errno=9 Bad file descriptor
令人惊讶的是,Windows 安全中心的被阻止的应用程序通知根本没有出现。但是当我手动转到允许应用程序通过受控文件夹访问→添加允许的应用程序并选择 php.exe
可执行文件时,composer 开始工作。