File tree Expand file tree Collapse file tree 1 file changed +36
-0
lines changed Expand file tree Collapse file tree 1 file changed +36
-0
lines changed Original file line number Diff line number Diff line change 1717use Symfony \Component \Routing \RouteCollection ;
1818use Symfony \Component \Routing \Router ;
1919use Symfony \Component \Routing \RouterInterface ;
20+ use Throwable ;
2021
2122/**
2223 * Class BaseRoutesConfigurator
@@ -191,10 +192,45 @@ private function warmUpCache() : void
191192 @mkdir ($ this ->cacheDir , 0777 );
192193 }
193194
195+ // Блокировка на предмет конкурентных запросов.
196+ $ lockFile = $ this ->cacheDir . '/route_collection.lock ' ;
197+
198+ // Silence E_WARNING to ignore "include" failures - don't use "@" to prevent silencing fatal errors
199+ $ errorLevel = error_reporting (\E_ALL ^ \E_WARNING );
200+
201+ $ lock = false ;
202+ try {
203+ if ($ lock = fopen ($ lockFile , 'w ' )) {
204+ flock ($ lock , \LOCK_EX | \LOCK_NB , $ wouldBlock );
205+ if (!flock ($ lock , $ wouldBlock ? \LOCK_SH : \LOCK_EX )) {
206+ fclose ($ lock );
207+ @unlink ($ lockFile );
208+ $ lock = null ;
209+ }
210+ } else {
211+ // Если в файл уже что-то пишется
212+ flock ($ lock , \LOCK_UN );
213+ fclose ($ lock );
214+ @unlink ($ lockFile );
215+
216+ return ;
217+
218+ }
219+ } catch (Throwable $ e ) {
220+ } finally {
221+ error_reporting ($ errorLevel );
222+ }
223+
194224 file_put_contents (
195225 $ this ->cacheDir . '/route_collection.json ' ,
196226 serialize (static ::$ router ->getRouteCollection ())
197227 );
228+
229+ if ($ lock ) {
230+ flock ($ lock , \LOCK_UN );
231+ fclose ($ lock );
232+ @unlink ($ lockFile );
233+ }
198234 }
199235
200236 static ::$ router ->getGenerator (); // Трюк по созданию кэша.
You can’t perform that action at this time.
0 commit comments