Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 22.06.2016
Сообщений: 54

Ошибка 500 при выполнении скрипта

06.10.2017, 15:10. Показов 4734. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Составил скрипт для формирования карты сайта sitemap. Точнее должны генерироваться много файлов (более 100) с записями по 50тыс. В базе несколько миллионов строк.
Сейчас работает так: при открытии страницы начинает выполняться скрипт, в папке на хостинге создаются файлы sitemap-N.xml плюс его архив sitemap-N.xml.gz. Скрипт работает примерно 45 секунд и выдается ошибка:
500 Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

В результате создается меньшее количество файлов чем требуется (38 из 100, например), при чем каждый раз разное.

Помогите, пожалуйста, разобраться в чем может быть причина? Может какие-либо настройки php или apache добавить\изменить?

Заранее спасибо большое!

Собственно код:
PHP
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
@ $db = mysql_pconnect("localhost" , "login", "pswd");
#mysql_query('SET  character_set_database  =  utf8'); 
mysql_query('SET  NAMES  utf8');
 
mysql_select_db( "db_name") ;
 
$ath3 = mysql_query("SELECT COUNT(*) FROM table1;");
$b = mysql_fetch_array($ath3);
$colvo = $b[0];
$colvo2 = round($colvo/50000);
 
$x = 0;
while ($x <= $colvo2-1) {
 
$start = $x*50000;
 
$ath2 = mysql_query("SELECT * FROM table1 LIMIT $start,50000;");
 
$Sitemap="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$Sitemap.="<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
 
while($row2 = mysql_fetch_object($ath2))
{
    $param1 = $row2->param1;
 
$Sitemap.="<url><loc>http://site.ru/$param1</loc><lastmod>2017-09-05</lastmod></url>\n";
}
 
$Sitemap.="</urlset>";
 
$file = "/home/root/data/www/login/sitemap/sitemap-$x.xml";
if(!$handle = fopen($file, "w")){
    echo "Cannot open file ($file)";
    exit;
}
 
if (fwrite($handle, $Sitemap) === FALSE) {
    echo "Cannot write to file ($file)";
    exit;
}
 
fclose ($handle);
 
$smdata =  file_get_contents("/home/root/data/www/login/sitemap/sitemap-$x.xml");
$gz = gzopen("/home/root/data/www/login/sitemap/sitemap-$x.xml.gz","w");
if(gzwrite($gz,$smdata) == -1){
echo 'Success!';
}
else
{
echo 'No';
}
            
gzclose ($gz);
 
$x++; 
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.10.2017, 15:10
Ответы с готовыми решениями:

При выполнении скрипта с командой mssql_connect(.....) выдается ошибка 'неизвестная команда'
знаю что такие вопросы уже были но ответов на них, действительно дельных я не нашел. Стоит: Apache, php4.3 (как модуль), msSql (клиент) и...

Error 500 при работе скрипта
Появилась такая проблема: Когда пользователь приходит на сайт и оставляет свое сообщение, коментарь или что-то вроде етого, то все...

Непонятный результат при выполнении скрипта для обработки формы
test.php: &lt;html&gt; &lt;head&gt; &lt;/head&gt; &lt;body&gt; &lt;?php $nume=$_GET; echo &quot;Значениe из формы: &quot; . $nume . &quot;&lt;br/&gt;&quot;; ...

13
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554
06.10.2017, 15:20
посмотрите в лог ошибок апача
по всей видимости или время выполнения РНР-скрипта или объем выделяемой ему памяти недостаточны.
все это меняется в конфиге РНР
0
0 / 0 / 0
Регистрация: 22.06.2016
Сообщений: 54
07.10.2017, 12:58  [ТС]
Цитата Сообщение от Dmitry Посмотреть сообщение
посмотрите в лог ошибок апача
по всей видимости или время выполнения РНР-скрипта или объем выделяемой ему памяти недостаточны.
все это меняется в конфиге РНР
Вот такое сообщение в логах:
"[fcgid:warn] [pid 69141] mod_fcgid: process 74547 graceful kill fail, sending SIGKILL"

Добавлено через 19 часов 57 минут
Время выполнения скриптов увеличил, все равно такая ошибка.
0
 Аватар для sad67man
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,834
07.10.2017, 14:32
Kadad, выполняйте скрипт порциями по 30 секунд.
0
0 / 0 / 0
Регистрация: 22.06.2016
Сообщений: 54
07.10.2017, 16:11  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
Kadad, выполняйте скрипт порциями по 30 секунд.
Спасибо! А за счет чего можно сделать порциями php?
0
 Аватар для sad67man
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,834
07.10.2017, 18:55
Kadad, К примеру так
PHP
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
ob_start();
$startTime = time();
session_start();
 
...
 
$x = !empty($_SESSION['x'])? (int) $_SESSION['x'] : 0;
 
while ($x < $colvo2) {
 
    ...
 
    $x++;
 
    if(time() - $startTime > 30) {
        break;
    }
 
}
 
$persent = floor($x * 100 / $colvo2);
echo "<hr>" . $persent . "%";
 
if($x >= $colvo2) {
    echo "<br>Done!";
} else {
    $_SESSION['x'] = $x;
    header( "refresh:0;" ); 
}
ob_end_flush();
0
0 / 0 / 0
Регистрация: 22.06.2016
Сообщений: 54
07.10.2017, 18:59  [ТС]
Спасибо большое! Попробую.
0
 Аватар для sad67man
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,834
07.10.2017, 19:03
Цитата Сообщение от Kadad Посмотреть сообщение
В базе несколько миллионов строк.
Цитата Сообщение от Kadad Посмотреть сообщение
$ath2 = mysql_query("SELECT * FROM table1 LIMIT $start,50000;");
Меня это смущает, При таком количестве строк LIMIT скорее всего будет сильно тормозить при больших значениях $start
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
07.10.2017, 19:50
Цитата Сообщение от Kadad Посмотреть сообщение
Сейчас работает так: при открытии страницы начинает выполняться скрипт
Не надо тяжелые задачи так запускать. Должна быть консольная команда, которая запускается например по крону
0
0 / 0 / 0
Регистрация: 22.06.2016
Сообщений: 54
11.10.2017, 12:55  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
Kadad, К примеру так
PHP
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
ob_start();
$startTime = time();
session_start();
 
...
 
$x = !empty($_SESSION['x'])? (int) $_SESSION['x'] : 0;
 
while ($x < $colvo2) {
 
    ...
 
    $x++;
 
    if(time() - $startTime > 30) {
        break;
    }
 
}
 
$persent = floor($x * 100 / $colvo2);
echo "<hr>" . $persent . "%";
 
if($x >= $colvo2) {
    echo "<br>Done!";
} else {
    $_SESSION['x'] = $x;
    header( "refresh:0;" ); 
}
ob_end_flush();
Работает, но с каждым новым файлом замедляется и потом опять Ошибка 500. Может по крону запустить, или разницы нет?
0
 Аватар для sad67man
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,834
11.10.2017, 21:26
Kadad, Я как и предполагал, тормоза из-за использование LIMIT при большом количестве записей, а особенно несколько миллионов, при большом числе $start время выполнения такого запроса может доходить до нескольких минут. Как бы вы не запускали скрипт, все равно нужно как-то оптимизировать запрос.

Добавлено через 1 минуту
Kadad, Я не силен в этих делах, почитайте что-нибудь про оптимизацию LIMIT
0
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
13.10.2017, 16:07
В таблице есть уникальное ключевое поле с auto increment? Типа идентификатор (id).
У меня обработка миллионов строк решается таким путем:

1. Во-первый в начале выполнения скрипта снимается лимит на время работы php:
PHP
1
ini_set('max_execution_time', 86400);
2. Далее обходим всю таблицу, все миллионы строк, но делаем это небольшими пачками, скажем по 2000 штук за раз. Тут то и вступает идентификатор. Нам нужно отслеживать максимальный id в запросе. Типа так:
PHP
1
2
3
4
5
6
7
8
9
10
11
$last_id = 0;
do {
    $sql = "SELECT * FROM `mytable` WHERE `id` > $last_id ORDER BY `id` ASC LIMIT 2000";
    $rows = getResult($sql); // Предположим эта функция выполняет запрос и возвращает массив строк из БД
    foreach ($rows as $row) {
        // Выполняем нужное вам действие со строкой.
        // ...
        
        $last_id = $row['id'];
    }
} while (count($rows) > 0);
Под свой код сами подгоните

Добавлено через 6 минут
Ну и такое лучше не выполнять гет запросом (при заходе на страницу). Если скрипт может работать долго, луче его запускать вручную из командной сроки, по крону или через ajax. При этом очень удобно реализовать что-то типа прогресс бара, или в случае командной строки просто выводить $last_id после каждой итерации запроса.
0
 Аватар для sad67man
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,834
13.10.2017, 20:36
Зверушь, На сколько я читал, для оптимизации рекомендуется вообще отказаться от limit и сортировок. И делать к примеру выборку по промежутку id-шников, либо по отдельному полю, которое будет нумеровать все элементы. Запрос с limit значительно медленней работает, тем более, когда вы добавляете сортировку, в памяти создается отсортированная таблица, и из нее берутся несколько записей, что требует много памяти.
0
0 / 0 / 0
Регистрация: 22.06.2016
Сообщений: 54
16.10.2017, 20:49  [ТС]
Всем спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.10.2017, 20:49
Помогаю со студенческими работами здесь

Задержка консоли при выполнении php скрипта через php.exe
Доброго времени суток! Я ассоциировал в total commander (внутренние ассоциации) файлы *.php с php.exe. Теперь при двойном щелчке у меня...

Ошибка 500 при обработке скрипта
Всем добрый день. Помогите, пожалуйста, найти ошибку. Есть форма с множеством полей, которая по нажатию на кнопку улетает на email. Скрипт,...

При выполнении скрипта возникла ошибка. Включить расширенный вывод ошибок можно в файле настроек .settings.php
Подскажите, как исправить эту ошибку &quot;При выполнении скрипта возникла ошибка. Включить расширенный вывод ошибок можно в файле настроек...

Ошибка 500 и время выполнения скрипта
У меня есть скрипт, который должен выполняться долгое время. Код в скрипте однотипный, рабочий, проверенный. Работаю с PHPExcel. Из бд,...

php.exe выдает ошибку при выполнении скрипта bat файлом
Приветствую Проблема собственно вот в чем. Под апачем скрипт запускается и работает (в скрипте соединения с базой данных, обработка:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru