Встроенный сервер PHP не может взломать
У меня есть относительно простой скрипт, подобный следующему:
<?php
$url = "localhost:2222/test.html";
echo "*** URL ***\n";
echo $url . "\n";
echo "***********\n";
echo "** whoami *\n";
echo exec('whoami');
echo "* Output **\n";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
Когда я выполняю его в командной строке, он работает - я получаю скудные результаты из test.html.
Когда я запускаю этот скрипт, загружая встроенный сервер PHP и просматривая его, он зависает. Нет вывода на экран, ничего не записано в журналах.
Я читал, что иногда могут мешать пользовательские разрешения, поэтому я попытался сделать whoami, чтобы убедиться, что пользователь, запустивший встроенный сервер PHP, совпадает с пользователем, который выполнил сценарий в командной строке; которые они есть.
safe_mode выключен, disable_functions установлен в ноль. Я могу успешно выполнить другие команды (например, whoami).
Что еще я должен проверить? Может ли встроенный сервер PHP считаться кем-то другим, когда он выполняет запрос?
3 ответа
Чтобы сделать комментарий ответом: встроенный веб-сервер разработки PHP - это очень простой однопоточный тестовый сервер. Он не может обрабатывать два запроса одновременно. Вы пытаетесь получить файл из себя в отдельном запросе, поэтому вы попали в тупик. Первый запрос ожидает завершения второго, но второй запрос не может быть обработан, пока первый еще выполняется.
Начиная с PHP 7.4 переменная окружения
PHP_CLI_SERVER_WORKERS
позволяет выполнять одновременные запросы , создавая несколько рабочих процессов PHP на одном и том же порту встроенного веб-сервера. Он считается экспериментальным, см . документы .
Используя его, PHP-скрипт может отправлять запросы самому себе, которые уже обслуживаются, не останавливаясь.
PHP_CLI_SERVER_WORKERS=10 php -S ...
Работает и с Laravel:
PHP_CLI_SERVER_WORKERS=10 php artisan serve
Я думаю проблема в вашем $url. Это может выглядеть так: $ url = " http://localhost:2222/test.html"; или $ url = " http://localhost/test.html"; Я думаю, что это решит вашу проблему. Спасибо за ваш вопрос. Удачи.