Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Removed LOCK_EX for writing Proxy class file #312

Closed
wants to merge 1 commit into from

6 participants

Martin Hasoň Alexander radepal Jaka Jančar Joseph Wynn Benjamin Eberlei
Martin Hasoň

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

Replaces #307

Alexander
Collaborator

@beberlei Did you want to merge this?

radepal

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

Jaka Jančar

Huh, LOCK_EX is there with a reason.

Martin Hasoň

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

Joseph Wynn

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

Jaka Jančar

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?

Jaka Jančar

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);
Benjamin Eberlei beberlei closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Mar 29, 2012
  1. Martin Hasoň
This page is out of date. Refresh to see the latest.
Showing with 1 addition and 1 deletion.
  1. +1 −1  lib/Doctrine/ORM/Proxy/ProxyFactory.php
2  lib/Doctrine/ORM/Proxy/ProxyFactory.php
View
@@ -189,7 +189,7 @@ private function _generateProxyClass(ClassMetadata $class, $fileName, $file)
throw ProxyException::proxyDirectoryNotWritable();
}
- file_put_contents($fileName, $file, LOCK_EX);
+ file_put_contents($fileName, $file);
}
/**
Something went wrong with that request. Please try again.