Skip to content

Removed LOCK_EX for writing Proxy class file #312

Closed
wants to merge 1 commit into from

6 participants

@hason
hason commented Mar 29, 2012

LOCK_EX will not work on NFS and many other networked file systems.

Replaces #307

@asm89
Doctrine member
asm89 commented May 4, 2012

@beberlei Did you want to merge this?

@radepal
radepal commented Jul 4, 2012

Is any chance to merge this ?
Working with Symfony2/doctrine on vagrant with nfs is impossible

@jakajancar

Huh, LOCK_EX is there with a reason.

@hason
hason commented Jul 4, 2012

The best solution for configurable file locking is by using stream, e.g. "safe://path_to_proxies".

new Doctrine\ORM\Proxy\ProxyFactory($em, $proxyDir = 'safe://path_to_proxies');

https://github.com/nette/nette/blob/master/Nette/Utils/SafeStream.php

@wildlyinaccurate

LOCK_EX is not really required, since proxy classes should only be generated manually (except in a dev environment).

@jakajancar

Dev environment is actually a pretty good reason: sometimes you have multiple concurrent requests being made (e.g. from an Ajax app), and you don't want one to corrupt another.

However, on further thought and some more testing, LOCK_EX is actually not sufficient: while this prevents a corrupt proxy file from being written to disk, it does not guarantee that a correct one will be read: require() does not use advisory locking.

This is a reason why I am experiencing:

PHP Fatal error:  Class 'Celtra\\Models\\Proxies\\__CG__\\Celtra\\Models\\Account' not found in .../server/vendor/doctrine/orm/lib/Doctrine/ORM/Proxy/ProxyFactory.php on line 102

I guess a new file would have to be written elsewhere and then atomically moved (rename()'d) into place. However, I'm not sure NFS supports overwriting rename().

Can you confirm?

@jakajancar

Overwriting rename seems to work on NFS.

@beberlei

Would it be possible to change:

file_put_contents($fileName, $file, LOCK_EX);

to

$tmpFileName = $fileName . '.' . uniqid("", true);
file_put_contents($tmpFileName, $file);
rename($tmpFileName, $fileName);
@beberlei beberlei closed this Jul 5, 2012
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.