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

@hason

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

Replaces #307

@asm89
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

@jakajancar

Huh, LOCK_EX is there with a reason.

@hason

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Mar 29, 2012
  1. @hason
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
View
2  lib/Doctrine/ORM/Proxy/ProxyFactory.php
@@ -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.