Тема: Task #8
Показать сообщение отдельно

  #12  
Старый 29.06.2019, 11:44
Тот_самый_Щуп
Участник форума
Регистрация: 23.03.2017
Сообщений: 265
С нами: 4812086

Репутация: 119
По умолчанию

Очень хороший таск. Как по мне, данная реализация в определенной степени зиродейная, и уж точно в паблике уникальная. Но действительно таск, и технология как уже писал Лайт, недооцененная.

Хочу отметить несколько интересных моментов, которые я видел в процессе отладки.

Когда решал первый пункт, я тупо воспользовался питоновским скриптом от Orange, который чутка подпилил под таск, и сначала отлаживался у себя на VPS, и в какой то момент остановив бесконечный цикл в питоновском скрипте - созданная сессия со всем содержимым перманентно осталась на сервере.

Полагаю, речь про уже упомянутый сегфолт. Но причину его появления, и как его вызвать в нужный момент, мне кажется искать нужно более глубже, в сорцах PHP, а тут мои полномочия уже как бы всё ©

По второму пункту, вот там уже начался хардкор. Связываться с питоном, и писать на нем решение не очень хотелось, поэтому ковырял возможности реализовать на однопоточном php, и вместо мультикурла решил воспользоваться вызовом системных команд.

Я для удобства у себя поставил в скрипт:

Код:
$file = '/var/lib/php/session/sess_iamorange';
if(file_exists($file)) { echo file_get_contents($file); }
И в процессе аплоада + обращению к скрипту наблюдал содержимое sess_iamorange. В общем суть такая, что у меня на моей VPS создавалась сессия, и была доступна для инклуда всего за 2 запроса, без всяких циклов. Пример кода:

Код:
shell_exec('curl http://my.vps -H \'Cookie: PHPSESSID=iamorange\' -F \'PHP_SESSION_UPLOAD_PROGRESS=ZZtestZ\' -F \'file=@/etc/passwd\' > /dev/null 2>/dev/null &');

$post = array(
'PHP_SESSION_UPLOAD_PROGRESS' => 'any_text',
'file' => '@/etc/passwd'
);
echo curl_post('http://my.vps',$post);
Суть кода, посылаем через системный курл спец запрос, не дожидаемся от курла ответа, фигачим второй запрос на php курле, и наблюдаем содержимое sess_iamorange

Т.е. данным кодом, который я посылал с одного сервера на сервер своей VPS, я видел гарантированное срабатывание, создание, и подхватывание сессии. А вот попробовав откуда-то ещё послать такой же запрос на свою VPS - уже не срабатывает.

Я полагаю, тут имеют место быть "тайминги", т.е. по микросекундам с двух серверов было идеальное совпадение, которое и позволило всего двумя запросами создать и проинклудить сессию. Как мне кажется, в эту сторону ещё можно поковырять, и возможно найти способ решения представленной задачи всего за 2 HTTP запроса, без всяких циклов и подгадываний размеров файла, так как посылая в одном потоке запрос:

Код:
shell_exec('curl http://my.vps -H \'Cookie: PHPSESSID=iamorange\' -F \'PHP_SESSION_UPLOAD_PROGRESS=ZZtestZ\' -F \'file=@/etc/passwd\' > /dev/null 2>/dev/null &');
Мы всегда имеем один и тот же результат в bytes_processsed + в content_length. Да, понятное дело, что для .zip хвост неактуален, но возможно будет критичен для других реализаций чего-либо на основе принудительной сессии.

По факту я не доковырялся до истины, и реализовал свой колхозный вариант на основе циклов + системной команды в качестве второго потока, который кое как работал.
 
Ответить с цитированием