powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Скрипт умирает не отработав
8 сообщений из 33, страница 2 из 2
Скрипт умирает не отработав
    #40032368
Фотография БурыйТина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

Очень интересно оказалось про сокеты.
Страницы открывать научился через SSL, но вот PDF скачивать не получается

Код: 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.
$port = 443;
$timeout = 30;
$host = "torta-torta.ru";
$path = "docs/pustoy-fayl-pdf-5-5d1eee323ff31-5d43c64a48619.pdf"; 
$opts = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false
    ),
	'header'=>array(
		"Accept-language: ru\r\n" .
        "Cookie: foo=bar\r\n" .
		"charset: windows-1251"
			)
);
$context = stream_context_create($opts);
$fp = stream_socket_client('ssl://'.$host.':'.$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
if (!$fp) {
    echo "Ошибка создания сокета $errstr ($errno)
\n";
} else {
	//fwrite($fp, $out);
    $out = "GET /$path  HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Connection: Close\r\n\r\n";
	echo "$out
\n";
    fwrite($fp, $out);
	
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
	
    fclose($fp);
}



Вот скрипт, дает вот такой ответ

авторGET /docs/pustoy-fayl-pdf-5-5d1eee323ff31-5d43c64a48619.pdf HTTP/1.1 Host: torta-torta.ru Connection: Close
HTTP/1.1 400 Bad Request Date: Tue, 29 Dec 2020 13:59:32 GMT Server: Apache/2.4.29 (Ubuntu) Content-Length: 312 Connection: close Content-Type: text/html; charset=iso-8859-1
Bad Request
Your browser sent a request that this server could not understand.
Apache/2.4.29 (Ubuntu) Server at www.codestudio.site Port 443



Что не так? Почему файл "забрать" не могу?
...
Рейтинг: 0 / 0
Скрипт умирает не отработав
    #40032410
Фотография БурыйТина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стоило задать вопрос, сразу пришел ответ
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
if (!$fp) {
    echo "Ошибка создания сокета $errstr ($errno)
\n";
} else {
	echo "Сокет успешно создан: $fp
\n";
	
    fwrite($fp, "GET /$path HTTP/1.0\r\nHost: $host\r\nAccept: */*\r\n\r\n");
	
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
	
    fclose($fp);



Все успешно выбрасывает в браузер. Теперь надо понять где начало и конец и как выделить именно PDF файл из ответа. Я думаю что действительно через сокеты будет надежнее качать чем курлом
...
Рейтинг: 0 / 0
Скрипт умирает не отработав
    #40032457
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БурыйТина
Теперь надо понять где начало и конец и как выделить именно PDF файл из ответа.

Стандартная структура:
1. Заголовки HTTP.
2. Пустая строка (означает окончание заголовков).
3. Тело ответа (контент).

Начните с изучения заголовков ответа сервера. Там может быть отражено множество нюансов.
А лучше, до того, с изучения основ протокола HTTP. Сложного там нет ничего, а лишним оно вряд ли будет. Похожие структуры найдете в других местах, например, в SIP.
...
Рейтинг: 0 / 0
Скрипт умирает не отработав
    #40032490
Фотография БурыйТина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

Да уже разобрался, спасибо
Код: php
1.
	list($header, $body) = explode("\r\n\r\n", $result, 2);


Вот так прекрасно разделяет и тело потом сохраняем в файл pdf
сейчас научусь разбирать заголовок. Мне по сути из него нужен ответ 200 или иной, и размер контента, чтобы сравнить с сохраненным файлом. Вы очень мне помогли дав правильное направление. По крайней мере в сокетах четко работает таймаут и процент удачных загрузок выше, чем у курла. Теперь смогу замыкать это в бесконечные циклы и запрещать выход без скачивания файла.
Останется только научиться еще сравнивать и сливать 2 JSON файла, чтобы в битрикс отдавать не всю "портянку" данных, а только новые данные и у меня одна часть будет сделана, можно будет в битриксе настроить бизнес процессы в зависимости от того, какие данные получены.
Спасибо большое за поддержку.
...
Рейтинг: 0 / 0
Скрипт умирает не отработав
    #40032493
Фотография БурыйТина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дописал загрузку через сокеты.
Исходя из анализа логов, у источника API данных стоит какое-то ограничение, о котором мне не сказали, и после определенной частоты запросов сначала выдают 500, а если начинаю запрашивать далее то вообще перестают отвечать.
Сейчас попробую поиграть с ожиданиями типа sleep и подобрать оптимальную частоту запросов посмотрю что будет.
...
Рейтинг: 0 / 0
Скрипт умирает не отработав
    #40032514
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БурыйТина
сравнивать и сливать 2 JSON файла
Получить из каждого JSON объект, а с ними уже выполнять сравнения, слияния и т.п. Не?


БурыйТина
сначала выдают 500, а если начинаю запрашивать далее то вообще перестают отвечать.
Гхм... Занятно. Не понятно, куда тут повод помирать скрипту затесался. Возможно, где-то на уровне библиотеки курла зашит. Выше, вроде, предлагал уже под отладчиком запустить срипт.

Ладно. Выходит, что торррррмоз, всё же, на удаленной стороне. И это надо как-то учесть.
Такая есть мысль. Таймауты сделать секунд пять. Может, семь... не более. Далее анализ всех ошибок. При тормозах или коде ответа не 200 сделать запись в лог и продолжить через минуту, полчаса, завтра... Если возможно, то продолжить со следующего за проблемным задания (гипотетически, удаленный сервер может на каких-то проблемных данных сваливаться в ошибку), чтобы исключить затык на каком-то одном проблемном. Тут есть, конечно, варианты.
...
Рейтинг: 0 / 0
Скрипт умирает не отработав
    #40032721
Фотография БурыйТина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал источнику API данных, они признали проблему на их стороне, поправили. Теперь ошибки присутствуют иногда, но не в таком объеме.
...
Рейтинг: 0 / 0
Скрипт умирает не отработав
    #40034438
Фотография БурыйТина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle
Отчасти странная функция. Есть же готовая https://www.php.net/manual/ru/function.tempnam для аналогичной цели.
Впрочем, и в том и в другом случае дерево для кэша не создается . А значит, по мере наполнения файлами (единицы тысяч) "плоской" директории появятся тормоза. Чем больше файлов - тем заметнее.
В ряде случаев кеш проще в базе хранить. Здесь как раз такой случай - им файла можно получить только лишь из базы, так почему бы сразу из базы не получить контент? Минус обращение к ФС получается. Впрочем, это вопрос другого толка, к данной теме отношения не имеет.


Дошли руки до этого замечания. Не поделитесь ли примером, как дерево для кэша создавать?
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Скрипт умирает не отработав
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]