besogonskiy
@besogonskiy
работаю php laravel разработчиком.

Каким способом можно отловить исключение при ошибке выкачки файла?

Я так и не смог понять проблему. Пытаюсь выкачать прайс с одного сайта и этот сайт отдает очень долго свой файл и иногда все заканчивается успешно - прайс выкачивается. А в других случаях вылетает ошибка и даже попытка отловить исключение на помогает. Я вам сейчас выложу и код и ссылку на файл для скачки, И текст ошибки. Помогите.

А то я уже подумал может на язык Java перейти, там как то это более продумано. А здесь по таймауту отваливается скорее всего попытка выкачать файл.

Вот код:
$url = 'https://kristallnails.ru/integration?int=ym&name=businesshunter';
        try {
            $priceFile = file_get_contents( html_entity_decode($url) );
        } catch (Exception $e) {
            info($e->getMessage());
        }


ErrorException

file_get_contents(https://kristallnails.ru/integration?int=ym&name=b...): failed to open stream: HTTP request failed!


Или если хотите полный log от Laravel, то
spoiler
[2021-03-06 22:22:14] local.ERROR: file_get_contents(https://kristallnails.ru/integration?int=ym&name=b...): failed to open stream: HTTP request failed! {"exception":"[object] (ErrorException(code: 0): file_get_contents(https://kristallnails.ru/integration?int=ym&name=b...): failed to open stream: HTTP request failed! at /home/xfile/dev/bh/back/app/Console/Commands/pasha.php:55)
[stacktrace]
#0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'file_get_conten...', '/home/xfile/dev...', 55, Array)
#1 /home/xfile/dev/bh/back/app/Console/Commands/pasha.php(55): file_get_contents('https://kristal...')
#2 /home/xfile/dev/bh/back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): App\\Console\\Commands\\pasha->handle()
#3 /home/xfile/dev/bh/back/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()
#4 /home/xfile/dev/bh/back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure))
#5 /home/xfile/dev/bh/back/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))
#6 /home/xfile/dev/bh/back/vendor/laravel/framework/src/Illuminate/Container/Container.php(610): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)
#7 /home/xfile/dev/bh/back/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call(Array)
#8 /home/xfile/dev/bh/back/vendor/symfony/console/Command/Command.php(256): Illuminate\\Console\\Command->execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))
#9 /home/xfile/dev/bh/back/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))
#10 /home/xfile/dev/bh/back/vendor/symfony/console/Application.php(971): Illuminate\\Console\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#11 /home/xfile/dev/bh/back/vendor/symfony/console/Application.php(290): Symfony\\Component\\Console\\Application->doRunCommand(Object(App\\Console\\Commands\\pasha), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#12 /home/xfile/dev/bh/back/vendor/symfony/console/Application.php(166): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#13 /home/xfile/dev/bh/back/vendor/laravel/framework/src/Illuminate/Console/Application.php(93): Symfony\\Component\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#14 /home/xfile/dev/bh/back/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#15 /home/xfile/dev/bh/back/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#16 {main}
"}
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Как всегда на тостере - клиент забыл палку к имени класса приставить, а набежали иксперты с советами про что угодно, только не про сам вопрос, который был задан.

Но вообще переходи на джаву конечно. Там это более продумано
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
slashinin
@slashinin
Задачи для PHP https://justcoding.ru
Дело не в языке, который вы используете, а скорее в понимании протоколов.
Когда вы делаете запрос используя протокол http у вас есть определённые ограничения.

Одно из ограничений это timeout, время ожидания, отведенное на ответ удалённого сервера.
Если скрипт вы запускаете через браузер, то есть так же ограничение, которое накладывает веб-браузер на ответ от php интерпретатора.

В любом случаи попробуйте вот такой код запустить через командную строку:

<?php
$context = stream_context_create(array(
	'http' => array(
		'timeout' => 60, // Время ожидания ответа от сервера
	)
));

$url = 'https://kristallnails.ru/integration?int=ym&name=businesshunter';
try {
    $priceFile = file_get_contents( html_entity_decode($url), false, $context );
} catch (Exception $e) {
    info($e->getMessage());
}

print_r($priceFile);
Ответ написан
Комментировать
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
А что, так не пробовали?
if ($priceFile === false) { echo("Error downloading price!");}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 20:02
100000 руб./за проект
25 апр. 2024, в 19:42
49000 руб./за проект
25 апр. 2024, в 19:41
2000 руб./за проект