|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
Доброе время суток. Возникла следующая проблема: скачиваю с сервера gzip файл по его протоколу. Протокол следующий: 1. Я с ним соединяюсь и отправляю команду "Дай файл": $fp = fsockopen("tcp://1.9.1.9", 4313, $errno, $errstr, 5); fputs ($fp, "getfile\r\n"); 2. Сервер меня спрашивает "Ты кто?": $line = fgets($fp); // who? 3. Я ему я тот-то: fputs ($fp, "login\r\n"); 4. Сервер спрашивает чего мне надо?: $line = fgets($fp); // what? 5. Я ему "Дай файл" fputs ($fp, "full\r\n"); // И вот тут сервер мне начинает слать здоровый файл. Я его получаю вот так: //socket_set_timeout($fp, 1); $file = fopen("D:\price.txt", "w"); while (!feof($fp)){ fwrite($file, fgets($fp,16384)); // 16384 - так файл скачивается быстрее }; Где-то через минуту файл у меня целиком оказывается, где я и ожидаю: D:\price.zip Но соединение не прерывается, сервер не сообщает, что передача окончена. Ни какого символа в конце передачи, означающего конец передачи, нет. Установка тайм-аута socket_set_timeout($fp, 1); в одну секунду не помогает. Как мне разорвать соединение, если от сервера нет сообщений? Или может у самого файла gzip есть какой-то признак окончания файла? У той стороны узнать не удалось. Помогите пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2017, 20:56 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
Перед отправкой файла отправляйте размер. А вообще велосипед. Чем тот же http или ssh не угодил? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2017, 21:06 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
Я не сервер. Я ничего не решаю, я клиент. Мне этот файл нужен регулярно. В принципе я его получаю, но клиент зависает до timeout. А хотелось бы написать пользователю: "файл получен". ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2017, 21:22 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
Если у сервера спросить "сколько байт в файле?" - он может дать конкретный и правильный ответ? Если может, то читаем из сокета, суммируем полученные байты, при достижении означенного количества закрываем соединение, так как файл получен. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2017, 21:28 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
Нет, сервер этого не умеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2017, 21:40 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
А нет ли в самом файле какого-то признака "конец файла"? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2017, 21:49 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
По всей видимости нет. Т. к. все что я получаю, я пишу в файл. Файл корректно открывается как gzip-архив WinRar'ом. Почему не работает установка тайм-аута в 1 сек? socket_set_timeout($fp, 1); Висит до параметра max_execution_time в php.ini. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2017, 21:58 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
vkleА нет ли в самом файле какого-то признака "конец файла"? Если там gzip - нужно его просто распаковать, данных хватило и контрольная сумма с размером сходится - значит всё прочитали, socket можно закрывать ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2017, 22:04 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
ZiB, Если файл успешно распаковался - сокет можно закрыть. Руками без всяких фантазий с таймаутами ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2017, 22:05 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
ИзопропилЕсли там gzip Оу, ну да, точно ж ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2017, 22:07 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
Все получилось следующим образом: stream_set_timeout($fp, 20); $file = fopen("D:\price.zip", "w"); while (!feof($fp)){ fwrite($file, fgets($fp,65536)); $info = stream_get_meta_data($fp); if ($info['timed_out']) { break; }; }; И код пошел дальше... а именно отправил пока серверу fputs ($fp, "bye\r\n"); и разорвал соединение: fclose ($fp); ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2017, 23:45 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
Если сеть лагнет, файл не докачается. Зачем выдумывать такие горе-протоколы.... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2017, 07:53 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
Я нашел в начале файла его размер. Но не смог его разобрать. Забил, и оставил так. Только тайм-аут побольше поставил. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2017, 08:31 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
ZiBЯ нашел в начале файла его размер. Но не смог его разобрать.А в чем проблема то? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2017, 08:38 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2017, 08:38 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
Кодировка файла непонятная, явно UTF-8, AkelPad именно в этой кодировке открывает и там читаемый текст. Но при импорте в этой кодировку в PostgreSQL пишет: INSERT INTO sxd.d(d) SELECT convert_from(pg_read_binary_file('2.csv'), 'UTF8'); ОШИБКА: неверная последовательность байт для кодировки "UTF8": 0x00 SQL-состояние: 22021 Собственно это время в не очень читаемом блоке находится. Начало файла: 꾅srjava.util.ArrayListxНơIsizexpy힇%UDFBF1;Значение справочника 1t2;Значение справочника 2t 17;Значение справочника 3t Вот теперь ломаю голову как его импортировать и распарсить. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2017, 09:29 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
ZiB, Голову ломать не надо, это очень похоже на формат сериализация Java Строки действительно в utf-8 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2017, 11:01 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
Как мне распарсить в PHP этот формат? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2017, 12:56 |
|
Закрытие соединения fsockopen() php7
|
|||
---|---|---|---|
#18+
ZiBКак мне распарсить в PHP этот формат? спецификацию прочитать - убедиться что оно (учесть, что формат не текстовый,а двоичный) Ну и разобрать ArrayList ( полный парсер писать необязательно) https://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2017, 14:15 |
|
|
start [/forum/topic.php?fid=23&fpage=33&tid=1460660]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 331ms |
total: | 480ms |
0 / 0 |