|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
Изломал всю головушку, но в чем проблема даже предположить не могу. Скрип работая, выполняя циклы, получая данные вдруг отмирает. Просто так, не объявляя войну и не крича о помощи, тихо мирно умирает. Скрип находится на хостинге ТаймВеб, является приложением для битрикс 24. Превышений нагрузки на хостинге нет, в логах хостинга нет сведений о принудительном завершении скрипта. В чем может быть причина и в какую сторону копать? подскажите пожалуйста (''')0___0(''') \ '( î_î )' / / \ \_0_/ / l . . l / /Y\ \ („„„)_(„„„) Превед ! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2020, 15:05 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
Вот так выглядит лог два цикл for один вложен в другой. Сначала узнаем количество страниц ответа, потом запускаем перебор по страницам получаем количество экземпляров на странице и начинаем запрашивать каждый экземпляр. Как видите выполнение умирает неожиданно Кусок лога: НАЧАЛО НОВОГО ОТЧЕТА Страниц в ответе: 10 i=1 page_cnt=10 Запрос к странице: ХХХХХХХХХХХХ Экземпляров: (case_cnt) 25 Далее код: Код: php 1.
Теперь лог выполнения кода j=0 case_cnt=25 j=1 case_cnt=25 j=2 case_cnt=25 j=3 case_cnt=25 j=4 case_cnt=25 j=5 case_cnt=25 j=6 case_cnt=25 j=7 case_cnt=25 j=8 case_cnt=25 j=9 case_cnt=25 j=10 case_cnt=25 j=11 case_cnt=25 j=12 case_cnt=25 j=13 case_cnt=25 j=14 case_cnt=25 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2020, 15:25 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
БурыйТина В чем может быть причина и в какую сторону копать? Начать можно с изучения ограничений хостинга и обращения в техподдержку. Чтобы убедиться в том, что срабатывают ограничения или нет. Дальше уже по ситуации. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2020, 18:12 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
vkle, Спасибо за ответ, но нет Во первых время работы на хостинге 800 секунд, а скрип умирает на 180-200 секунде как правило, проц не перегружается, это я уже проверил, логирую каждую строчку теперь чтобы понять где что умирает, непонятка полная пока ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2020, 20:25 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
Итак, новые вводные. Умирает на curl_exec хотя далеко не всегда. Видимо что-то не получается с каким-то очередным запросом. Подскажите пожалуйста как отследить и отработать ошибку? curl_error пользы не приносит, ибо если скрип умирает, то он никуда больше не идет. while(($data = curl_exec($ch)) === false or $data == '' ) такая конструкция у меня пытается заставить отработать запросы, но внутрь while не попадает обработчик. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 22:50 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
БурыйТина Умирает на curl_exec хотя далеко не всегда. Кстати, что ответила техподдержка по существу проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 01:19 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
vkle, поддержкаЗдравствуйте. К сожалению, на текущий момент в логе не наблюдаем проблем которые могут привести превышению каких-либо лимитов и принудительному завершению скрипта. поддержкаmax_execution_time, его значение равно 800 секунд. отключение скрипта происходит гораздо раньше. Установка бесконечного времени на выполнение скрипта, тоже не дает эффекта. Зато утром в логах я увидел что Код: php 1.
все же работает и повторяет запросы при пустом ответе и если возвращается ошибка. Может на этом решится проблема? Буду смотреть. Я так понимаю что все события предусмотрены вышеприведенным кодом, за исключением того, что закончился лимит времени на выполнение ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 06:37 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
Вот так выглядит кусок кода Код: 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.
В логах последняя запись лог2020-12-20 08:54:01 делан запрос: http:ХХХХХ После этого тишина. Всю голову уже сломал, что я не предусмотрел? Не отвечает curl_exec? Как это отловить и обработать? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 09:13 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
БурыйТина Не отвечает curl_exec? Как это отловить и обработать? Какие я вижу возможные варианты: - Процесс крашится с выпаданием в кору (что-то вроде файлика php.core образуется). Можно даже поковыряться в нем и обнаружить причину падения, вроде несоответствия какой-нить структуры данных (возможно после не слишком удачного обновления). - То же самое, но сохранение коры либо запрещено на уровне системы, либо валится она в недоступное для пользователя место. Понятно, что в таком случае посмотреть вообще ничего не получится. Да и увидеть сам факт падения не представляется возможным. - Процесс принудительно завершает (или убивает - от слова kill) ядро ОС (или другие "силовые структуры" сервера), обнаружив превышение норм потребления - по памяти, по ресурсам CPU или по каким-то еще признакам/свойствам/ограничениям. Вот это навскидку и самое частое на мой взгляд. Раумеется в пхпшных логах будет полное отсутствие какой-либо информации, т.к. процесс php, который пишет лог, уже не существует и не может никуда и ничего записать. Однако, вполне возможно, что логгирование чего-то подобного имеется на уровне ОС, но рядовому пользователю недоступно. Потому в саппорт. БурыйТина поддержкаmax_execution_time, его значение равно 800 секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 10:32 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
ИТОГО: Отсутствие ответа обработать в данной ситуации невозможно, а исправлять ситуацию долго и дорого. Надо смириться. Так? ЗЫ автор- Процесс принудительно завершает (или убивает - от слова kill) ядро ОС (или другие "силовые структуры" сервера), обнаружив превышение норм потребления - по памяти, по ресурсам CPU или по каким-то еще признакам/свойствам/ограничениям. Это тщательно и неоднократно проверялось. Нет превышений и "силовые структуры" тут не причем. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 10:38 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
Продолжение ЛогФайл вернул ошибку: Connection timed out after 60000 milliseconds2020-12-20 11:28:45 зашли в обработку ошибки или пустого значения 2020-12-20 11:28:45 Запрос: http://ХХХХ вернул ошибку: Connection timed out after 60000 milliseconds2020-12-20 11:28:45 зашли в обработку ошибки или пустого значения 2020-12-20 11:28:45 Запрос: http://ХХХХ вернул ошибку: Connection timed out after 60000 milliseconds2020-12-20 11:28:45 зашли в обработку ошибки или пустого значения 2020-12-20 11:28:45 Запрос: http://ХХХ вернул ошибку: Connection timed out after 60000 milliseconds2020-12-20 11:28:45 зашли в обработку ошибки или пустого значения 2020-12-20 11:28:45 Запрос: http://ХХХХ вернул ошибку: Connection timed out after 60000 milliseconds2020-12-20 11:28:45 зашли в обработку ошибки или пустого значения 2020-12-20 11:28:45 Запрос: http:ХХХХ вернул ошибку: Connection timed out after 60000 milliseconds2020-12-20 11:28:45 зашли в обработку ошибки или пустого значения 2020-12-20 11:28:45 Запрос: http://ХХХ вернул ошибку: Connection timed out after 60000 milliseconds2020-12-20 11:28:45 зашли в обработку ошибки или пустого значения 2020-12-20 11:28:45 Запрос: http://ХХХХ И так 2 Гигабайта По логу видно что он не ждет 60 секунд. Что это может значить? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 12:03 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
Не понятно, почему крашится на curl_exec один раз, а в логе множественные записи. Есть внешний цикл, которого тут не видно? Назначение цикла while в примере не понял, $data внутри цикла не меняется же. Сделайте, пожалуйста, небольшой, но достаточно полноценный тестовый пример, иллюстрирующий проблему. Чтобы можно было его скопипастить с форума и запустить на своей машинке. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 13:20 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
Крашится curl_exec из этого цикла и записи из этого цикла, более внешнего цикла нет. Дата меняется от выполнения curl_exec. Много раз все отрабатывается хорошо и дает нужный результат, но после 40-50 вызовов происходит краш. Пока писал, возникла мысль, может тот кто дает мне API считает что я слишком часто запросы делаю и тупо блочит меня? При этом не говоря это? Надо попробовать паузу поставить между запросами. Только вот не понимаю почему он не ждет 60 секунд, как в опциях написано? Может сразу ошибку получает? Но какую? как ее поймать и отработать? Проблема возникает когда не отвечает API Код прописать не могу, так как для чистоты эксперимента придется открывать АПИ источник и ключ. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 16:03 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
Нафига открывать то? Насколько понимаю, проблема проявляется при connection timeout, когда не удалось установить TCP-соединение с вебсервером. Бан по айпи на стороне вебсервера вполне подходит. Или вебсервер перегружен и не имеет возможности принять подключение. Как вариант, возможно, но не уверен, не удалось установить защищенное соединение, в том числе, по причине проблем с проверкой сертификата SSL. В простейшем случае можно сделать обращение на свой же вебсервер, который то доступен, то недоступен (остановлен, порт не слушает). Включать/выключать можно хоть ручками. БурыйТина Крашится curl_exec из этого цикла БурыйТина Только вот не понимаю почему он не ждет 60 секунд, как в опциях написано? Может сразу ошибку получает? Но какую? как ее поймать и отработать? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 18:53 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
Вот код целиком Код: 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. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72.
В логе всегда все заканчивается одинаково curl_info.log 2020-12-28 19:29:52 *****************ПОПЫТКА СКАЧАТЬ ФАЙЛ*************** Адрес для скачивания https://pdf 2020-12-28 19:29:52 Файл не загружался ранее 2020-12-28 19:29:52 *****************ПОПЫТКА СКАЧАТЬ ФАЙЛ*************** И после этого тишина. До этого может быть скачано несколько файлов успешно, а может и вообще ничего не скачать. Как с этим бороться? ЗЗы время отключки скрипта всегда разное, техподдержка таймвеба не видит ничего, что бы прибивало скрипт ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2020, 19:37 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
БурыйТина Вот код целиком Если же это некая рыба, которую следует обработать напильником по своему соображению... Не знаю, кому как, вот мне лень этим заниматься. Ладно. Если предполагаете, что проблема где-то в курле, тогда есть вот какое предложение. Не упираться в курл, а реализовать запрос/получение контента с удаленного сервера на более низком уровне, на сокетах. Понятно, что код будет строк на десять длиннее. Однако, возможностей для логгирования чуточку больше. БурыйТина Как с этим бороться? Задали вопрос техподдержке. Они не увидели проблему на реальном скрипте. Понятно. И всё? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2020, 21:26 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
vkle, Спасибо за ответ! Я не имею опыта программирования и не имею соответствующего образования. Решаю прикладную задачу под себя лично. теперь по деталям начнем с простого Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9.
Что касаемо таблицы, то это кэш своеобразный, чтобы 2 раза не скачивать одно и тоже По последнему авторА какие способы Вы уже пробовали за более чем десять дней? Задали вопрос техподдержке. Они не увидели проблему на реальном скрипте. Понятно. И всё? Сделал все что смог, на что хватает знаний и образования. Всячески изучил курл, много нового узнал, поигрался с таймаутами, ожиданиями и т.д. Понял что никак сам не справлюсь и пришел сюда, узнал новое слово "сокеты" пошел гуглить что это и говнокодить. Что умею ... Спасибо что помогаете. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2020, 21:47 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
Отчасти странная функция. Есть же готовая https://www.php.net/manual/ru/function.tempnam для аналогичной цели. Впрочем, и в том и в другом случае дерево для кэша не создается. А значит, по мере наполнения файлами (единицы тысяч) "плоской" директории появятся тормоза. Чем больше файлов - тем заметнее. В ряде случаев кеш проще в базе хранить. Здесь как раз такой случай - им файла можно получить только лишь из базы, так почему бы сразу из базы не получить контент? Минус обращение к ФС получается. Впрочем, это вопрос другого толка, к данной теме отношения не имеет. БурыйТина пошел гуглить По сокетам в документации есть, с примерами: https://www.php.net/manual/ru/function.fsockopen ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2020, 23:30 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
Я наигрался с попыткой хранения JSON ответов в БД, целый день пытался понять что я делаю не так, а потом узнал что моя версия MYSQL не позволяет хранить JSON. И когда очередь дошла до хранения PDF я как то не думал даже о его хранении в БД, а сделал хранение в ФС сразу. Тут у меня возникает еще одна проблема, иногда почему-то файл скачивается не полностью. В отчете отдан весь файл, судя по объему переданных данных, а по факту получаю "битый" pdf. Таких файлов около 10% получается. Про хранение в базе услышал, а пока писал возникла мысль, может эти файлы разнести как-то по директориям? Получать общее количество файлов в директории и создавать следующую? Вы это имели ввиду когда писали дерево для кэша? Я только со второго прочтения понял. Я бы не хотел базу файлами забивать или это совсем не страшно? Про https://www.php.net/manual/ru/function.tempnam не знал, поэтому "слепил" странную функцию. За сокеты спасибо, читаю, очень интересная тема оказалась. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 05:28 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
БурыйТина а потом узнал что моя версия MYSQL не позволяет хранить JSON. По сути, JSON - это текст. Можете открыть в текстовом редакторе и убедиться. Для хранения же текста есть куча текстовых и бинарных (произвольные последовательности байтов) типов данных. Тынц . ENUM и SET не годятся, остальное вполне пригодно в зависимости от конкретной ситуации. БурыйТина В отчете отдан весь файл, судя по объему переданных данных, а по факту получаю "битый" pdf. Таких файлов около 10% получается. БурыйТина может эти файлы разнести как-то по директориям? Получать общее количество файлов в директории и создавать следующую? Вы это имели ввиду когда писали дерево для кэша? БурыйТина Я бы не хотел базу файлами забивать или это совсем не страшно? Однако, в большинстве случаев следует обращать внимание на структуру таблиц. Например чтобы при JOIN временные таблицы значительных размеров не создавались и/или не падали на диск в обязательном порядке. Однако, это всё за рамками данного топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 06:16 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
БурыйТина, б24 часом не под IIS работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 10:03 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
peter64, Не знаю, он облачный ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 11:46 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
БурыйТина, попробуйте в начало скрипта вставить error_reporting(E_ALL) и посмотрите результат; Была похожая проблема с IIS. При обработке exсel файлов вылетал скрипт. У IIS было ограничение по времени работы скрипта. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:32 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
БурыйТина, https://stackoverflow.com/questions/31472800/connection-timed-out-after-10000-milliseconds-in-curl-and-php-geocoder Рекомедуют : curl_setopt($curl, CURLOPT_TIMEOUT,0); Ваша ошибка : Connection timed out after 60000 milliseconds2020-12-20 11:28:45 зашли в обработку ошибки или пустого значения 2020-12-20 11:28:45 Запрос: http:ХХХХ У Вас в скрипте : curl_setopt($ch, CURLOPT_TIMEOUT, 60); //CURLOPT_TIMEOUT => 60 Возможно поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 12:44 |
|
Скрипт умирает не отработав
|
|||
---|---|---|---|
#18+
peter64, авторпопробуйте в начало скрипта вставить error_reporting(E_ALL) и посмотрите результат; Была похожая проблема с IIS. При обработке exсel файлов вылетал скрипт. У IIS было ограничение по времени работы скрипта. Спасибо, вставил авторБурыйТина, https://stackoverflow.com/questions/31472800/connection-timed-out-after-10000-milliseconds-in-curl-and-php-geocoder Рекомедуют : curl_setopt($curl, CURLOPT_TIMEOUT,0); Это не буду, так как после таймаута, должны делать запрос повторно, источник данных не всегда отвечает. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 16:31 |
|
|
start [/forum/topic.php?fid=23&msg=40031945&tid=1459528]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 160ms |
0 / 0 |