0 / 0 / 0
Регистрация: 22.06.2016
Сообщений: 54

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Составил скрипт для формирования карты сайта 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
13383 / 7511 / 825
Регистрация: 09.09.2009
Сообщений: 29,366
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
2484 / 1408 / 667
Регистрация: 23.08.2015
Сообщений: 3,552
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
2484 / 1408 / 667
Регистрация: 23.08.2015
Сообщений: 3,552
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
2484 / 1408 / 667
Регистрация: 23.08.2015
Сообщений: 3,552
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
2484 / 1408 / 667
Регистрация: 23.08.2015
Сообщений: 3,552
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
2484 / 1408 / 667
Регистрация: 23.08.2015
Сообщений: 3,552
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
Реализация конвейеров машинного обучения с Python и Scikit-learn
AI_Generated 23.04.2025
Мир данных вокруг нас растёт с каждым днём, и умение эффективно обрабатывать информацию стало необходимым навыком. Специалисты по машинному обучению ежедневно сталкиваются с задачами предобработки. . .
Контроллеры Kubernetes Ingress: Сравнительный анализ
Mr. Docker 23.04.2025
В Kubernetes управление входящим трафиком представляет собой одну из ключевых задач при построении масштабируемых и отказоустойчивых приложений. Ingress — это API-объект, который служит вратами. . .
Оптимизация кода Python с Cython и Numba
py-thonny 23.04.2025
Python прочно обосновался в топе языков программирования благодаря своей простоте и гибкости. Разработчики любят его за читабельность кода и богатую экосистему библиотек. Но у этой медали есть и. . .
Микросервис на Python с FastAPI и Docker
ArchitectMsa 23.04.2025
В эпоху облачных вычислений и растущей сложности программных продуктов классическая монолитная архитектура всё чаще уступает место новым подходам. Микросервисная архитектура становится фаворитом. . .
Создаем веб-приложение на Vue.js и Laravel
Reangularity 23.04.2025
Выбор правильного технологического стека определяет успех веб-проекта. Laravel и Vue. js формируют отличную комбинацию для создания современных приложений. Laravel — это PHP-фреймворк с элегантным. . .
Максимальная производительность C#: Span<T> и Memory<T>
stackOverflow 22.04.2025
Мир высоконагруженных приложений безжалостен к неэффективному коду. Каждая миллисекунда на счету, каждый выделенный байт памяти может стать причиной падения производительности. Разработчики на C#. . .
JWT аутентификация в Java
Javaican 21.04.2025
JWT (JSON Web Token) представляет собой открытый стандарт (RFC 7519), который определяет компактный и самодостаточный способ передачи информации между сторонами в виде JSON-объекта. Эта информация. . .
Спринты Agile: Планирование, выполнение, ревью и ретроспектива
EggHead 21.04.2025
Спринты — сердцевина Agile-методологии, позволяющая командам создавать работающий продукт итерационно, с постоянной проверкой гипотез и адаптацией к изменениям. В основе концепции спринтов лежит. . .
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров
Programma_Boinc 21.04.2025
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров. 3 марта 2025 года, в результате обобщенного поиска простых чисел Ферма в PrimeGrid был найден. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru