Этого можно добиться, используя curl и загрузив скрипт как веб-ресурс, чтобы его можно было выполнить.Если этот скрипт необходимо защитить от публичного доступа, вы можете проверить, поступил ли запрос с того же сервера:
if( $_SERVER['SERVER_NAME'] != 'localhost'
|| $_SERVER['REMOTE_ADDR'] != '127.0.0.1'
|| stripos( $_SERVER['HTTP_USER_AGENT'], 'wget' )===false
)
{
// Access Denied!!
die();
}
Обязательно сделайте асинхронный запрос с curl, поэтому, если скрипт занимает много временичтобы выполнить, не вешает исходный пользовательский запрос (используйте curl_setopt( $handle, CURLOPT_HEADER, false );
Таким образом, план со страницы, где вы знаете, что нужно выполнить сценарий, запустите запрос Http к сценарию (этоочень простой пример использования библиотеки curl):
$handle = curl_init();
curl_setopt( $handle, CURLOPT_URL, 'http://localhost/your_script.php');
curl_setopt( $handle, CURLOPT_HEADER, false );
curl_exec( $handle );
curl_close( $handle );
Затем в своем сценарии используйте приведенный выше сценарий для защиты запросов, не поступающих с текущего сервера, и выполните задание.
Обновлено
Как указано в этом вопросе: отправка неблокирующего HTTP-запроса POST В своем задании сценария вы можете отправить этот заголовок, чтобы закрыть соединение во время выполнения сценария:
// Send the response to the client
header('Connection: Close');
// Do the background job: just don't output anything!
Обновлено II
Анализируя мой собственный ответ, я проверил, что curl_setopt( $handle, CURLOPT_HEADER, false );
не создает асинхронный запрос. Я до сих пор не нашел, как это сделать.