Reputation: 170
We've recently upgraded our servers from PHP 5.4.15 to 5.5.1 and have started getting this error in the logs
Fatal Error Unable to create lock file: Bad file descriptor
I've tracked it down to this bit a code that opens another small PHP script which uploads a file to S3 in the background.
// 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');
Upvotes: 2
Views: 18720
Reputation: 183
I got the Bad file descriptor
in php-cli in Windows because I had the Controlled folder access setting turned on in Windows Security → Virus & threat protection → Ransomware Protection.
When I was trying to run composer from the command line, it wasn't able to initialise, and gave the error -
[ErrorException]
file_put_contents(): Write of 111 bytes failed with errno=9 Bad file descriptor
Surprisingly, Windows Security's blocked app notification didn't appear at all. But when I manually went to Allow an app through controlled folder access → Add an allowed app and selected the php.exe
executable, composer started working.
Upvotes: 1
Reputation: 1879
If you are on Ubuntu your /tmp permissions are off.
Running this fixed it for me when trying to run php artisan serve
for laravel.
Run:
chmod 1777 /tmp
You may need to use sudo
.
See the original post here:
Upvotes: 0
Reputation: 13821
I was able to resolve with opcache.enable_cli=1
, but for me the underlying problem was wrong permissions on the /tmp
directory in MacOS.
This is what I did to fix this:
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
Upvotes: 5
Reputation: 170
It turns out that this error was caused by our configuration of OPcache which was enabled during the PHP upgrade process. When I disable it for command line operations by removing this setting from php.ini everything works fine.
opcache.enable_cli=1
Upvotes: 6