Скрипт foreach выдаёт ошибку 504 Gateway Time-out
Может можно как-то его разбить на куски, чтобы он потихоньку работал в фоне пока всё не ресайзит?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
public function resize() { $inputfiles = []; $products = Storage::disk('local')->allFiles('img/products'); $news = Storage::disk('local')->allFiles('img/news'); $inputfiles = array_merge($products, $news); $path = function($value) { return storage_path('app/' . $value); }; $inputfiles = array_map($path, $inputfiles); $lg = function($value) { return Str::replaceLast('app/img', 'app/public/thumbs_lg', $value); }; $md = function($value) { return Str::replaceLast('app/img', 'app/public/thumbs_md', $value); }; $thumbs_lg = array_map($lg, $inputfiles); $thumbs_md = array_map($md, $inputfiles); foreach( array_combine($inputfiles, $thumbs_lg) as $infile => $outfile ) { $img = Image::make($infile)->resize(1024, 768, function($constraint) { $constraint->aspectRatio(); // keep aspect ratio $constraint->upsize(); // prevent possible upsizing }); $img->save($outfile); } foreach( array_combine($thumbs_lg, $thumbs_md) as $infile => $outfile ) { $width = Image::make($infile)->width(); $height = Image::make($infile)->height(); if ($width > $height) { $img = Image::make($infile)->widen(450, function($constraint) { $constraint->upsize(); // prevent possible upsizing }); } else { $img = Image::make($infile)->heighten(410, function($constraint) { $constraint->upsize(); // prevent possible upsizing }); } $img->save($outfile); } return back()->with([ 'status' => 'success', 'messageHeader' => 'Image uploaded successfully!', 'messageContent' => 'All done.' ]); }
CodeMarks
Профессиональная доработка OpenCart интернет магазинов. Гарантия, поэтапная работа, высочайшее качество!
Убираем 504 Gateway Time-out nginx — при выполнении долгих скриптов
При запуске скриптов PHP требующих длительного выполнения бывает часто, что появляется ошибка 504 Gateway Time-out nginx, — это говорит о том, что nginx работает в режиме прокси и обрубает коннект не дождавшись выполнения скрипта.
Для решения этой проблемы в моем случае помогли следующие манипуляции:
1) Увеличил время выполнения PHP скриптов.
Выставляем значение max_execution_time = 360 — это означает 360 сек.
2) В конфиг nginx добавляем директивы позволяющие ожидать выполнения скрипта более длительное время.
В ispManager это делается так — Домены -> WWW-домены -> Конфиг -> Добавляем как на скрине, сохраняем и готово!
Поставлю 600 (600 сек.) — этого должно быть достаточно.
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
Вот и все, теперь скрипты будут выполняться долго и nginx будет дожидаться выполнения — это очень часто требуется при парсинге или импорте/экспорте товаров (в моем случае).
Php 504 gateway time out при выполнении цикла
If you’re experiencing a 504 Gateway Timout on your long PHP scripts, despite having lengthy execution times in php.ini, here are some things you should check.
PHP Config
If you haven’t yet, make sure both max_execution_time and max_input_time in your php.ini file are set to a sufficient number of seconds. For example:
max_execution_time = 600
max_input_time = 600
Apache Config
If you have PHP set correctly, it may be Apache’s config that is timing out. The setting that controls its timeout is not always present in httpd.conf by default, so you may have to add it.
Open up httpd.conf and look for the setting Timeout . If it doesn’t exist, add it on its own line and set it to a sufficient number of seconds. For example:
PHPMyAdmin
If you’re experiencing the timeout in PHPMyAdmin, keep in mind that it has its own execution time limit ExecTimeLimit . Open up config.inc.php and if it doesn’t exist, add a config option with a sufficient number of seconds like this:
$cfg[‘ExecTimeLimit’] = 600;
If that config option already exists, edit it to the desired number of seconds.
Arvind G Nov 06, 2021
Thanks for such helpfull post. I was struggling for more than 2 days to resolve this problem. My problem resolved. Thanks again.
Steve Oct 16, 2020
Thank you for this. it was definitely this setting that had to be added in, Timeout 600 in /etc/httpd/conf/httpd.conf, to prevent a gateway timeout error with an api server in my app.
Nick Vogt Oct 28, 2015
If you’re on a shared host, you may not have full access to these properties. You can try setting them in your php file or htaccess, but that depends on your server setup. You’ll have to ask them.