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 17
17
use Symfony \Component \Routing \RouteCollection ;
18
18
use Symfony \Component \Routing \Router ;
19
19
use Symfony \Component \Routing \RouterInterface ;
20
+ use Throwable ;
20
21
21
22
/**
22
23
* Class BaseRoutesConfigurator
@@ -191,10 +192,45 @@ private function warmUpCache() : void
191
192
@mkdir ($ this ->cacheDir , 0777 );
192
193
}
193
194
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
+
194
224
file_put_contents (
195
225
$ this ->cacheDir . '/route_collection.json ' ,
196
226
serialize (static ::$ router ->getRouteCollection ())
197
227
);
228
+
229
+ if ($ lock ) {
230
+ flock ($ lock , \LOCK_UN );
231
+ fclose ($ lock );
232
+ @unlink ($ lockFile );
233
+ }
198
234
}
199
235
200
236
static ::$ router ->getGenerator (); // Трюк по созданию кэша.
You can’t perform that action at this time.
0 commit comments