php - unlink throws error: Resource temporarily unavailable

Abhishek Reddy picture Abhishek Reddy · Mar 29, 2017 · Viewed 13.4k times · Source

Here is the piece of code:

public function uploadPhoto(){
    $filename = '../storage/temp/image.jpg';  
    file_put_contents($filename,file_get_contents('http://example.com/image.jpg'));
    $photoService->uploadPhoto($filename);
    echo("If file exists: ".file_exists($filename));
    unlink($filename);
}

I am trying to do the following things:

  1. Get a photo from a URL and save it in a temp folder in my server. This works fine. The image file is created and echoes If file exists: 1 when echo("If file exists: ".file_exists('../storage/temp/image.jpg'));.
  2. Pass that file to another function that hanldes uploading the file to Amazon s3 bucket. The file gets stored in my s3 bucket.
  3. Delete the photo stored in the temp folder. This doesn't work! I get an error saying:

unlink(../storage/temp/image.jpg): Resource temporarily unavailable

If I use rename($filename,'../storage/temp/renimage.jpg'); instead of unlink($filename); i get an error:

rename(../storage/temp/image.jpg,../storage/temp/renimage.jpg): The process cannot access the file because it is being used by another process. (code: 32)

If I remove the function call $photoService->uploadPhoto($filename);, everything works perfectly fine.

If the file is being used by another process, how do I unlink it after the process has been completed and the file is no longer being used by any process? I do not want to use timers.

Please help! Thanks in advance.

Answer

Aimer picture Aimer · Jun 30, 2017

Just had to deal with a similar Error.

It seems your $photoService is holding on to the image for some reason... Since you didn't share the code of $photoService, my suggestion would be to do something like this (assuming you don't need $photoService anymore):

[...]
echo("If file exists: ".file_exists($filename));
unset($photoService);
unlink($filename);
}

The unset() method will destroy the given variable/object, so it can't "use" (or wharever it does) any files.