Например есть скрипт a.php
, в котором нужно вызвать тяжеловесный скрипт b.php
и не дожидаясь его окончания продолжить работу. Одно из решений это сокеты:
// a.php
function exec_script($url, $params = array())
{
$parts = parse_url($url);
if (!$fp = fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80))
{
return false;
}
$data = http_build_query($params, '', '&');
fwrite($fp, "POST " . (!empty($parts['path']) ? $parts['path'] : '/') . " HTTP/1.1\r\n");
fwrite($fp, "Host: " . $parts['host'] . "\r\n");
fwrite($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
fwrite($fp, "Content-Length: " . strlen($data) . "\r\n");
fwrite($fp, "Connection: Close\r\n\r\n");
fwrite($fp, $data);
fclose($fp);
return true;
}
exec_script('http://example.com/b.php', array('foo' => 'bar'));
В примере, в скрипте b.php
будет доступна переменная $_POST['foo']
со значением bar
.
Комментарии
О! Спасибо! То что нужно!
Если в параметрах передать массив из нескольких элементов, то на странице b.php будет доступна только переменная из первого элемента массива.
Т.е. так
exec_script('http://mysite.com/b.php', array('hello' => 'world', 'hello2' => 'world2'));
будет доступна только переменная $_POST['hello'], а $_POST['hello2'] нет.
будут доступны обе переменные. проверено неоднократно
Почему-то по умолчанию http_build_query в качестве разделителя ставит &
Поэтому и имя переменной было своеобразным, что-то типа $_POST['amp;hello2']
Принудительно выставил разделителем & и все стало хорошо
$data = http_build_query($params, '', '&')
Спасибо за скрипт, очень помог.
разделитель прописывается в php.ini, в директиве arg_separator.output, видимо у вас это
&
спасибо!
На действительно тяжеловесный скрипт всё-равно вылетает по тайм-ауту. Поэтому в этом с лучае всё-таки придётся использовать shell_exec()
добрый день,
добавил этот скрипт в views php , встретился с такой ошибкой
Fatal error: Cannot redeclare exec_script() (previously declared in /sites/all/modules/views_php/plugins/views/views_php_handler_field.inc(223) : runtime-created function:2) in /sites/all/modules/views_php/plugins/views/views_php_handler_field.inc(223) : runtime-created function on line 2
как с этим бороться.. или подскажите как запустить другой скрипт из views
Спасибо.
переименуйте функцию
переименовать в любое имя ?
переименовал, все то же
Fatal error: Cannot redeclare myfunc() (previously declared in ...
переименовать в любое доступное имя
переименовал в funcxandex , такой занятой не должно быть
и сново та же ошибка
Fatal error: Cannot redeclare funcxandex() (previously declared..
значит пытаетесь создать функцию в цикле. так делать нельзя
Скрипт работает отлично, долго искал решения, спасибо! Но...
Если требуется авторизация, работать перестает :(
добавление
fwrite($fp, "Authorization: Basic ".base64_encode("user:pass")."\r\n");
не помогает.
Может подскажешь что делать? Спасибо!
to Deiww
А если сессии использовать?
А чем они помогут? И как это реализовать...
Отличная заначка!
Поставил пример скрипта на сервер - не работает. Поставил на другой сервер - работает. На том сервере - где не работает в логах nginx нашел вот это:
Получается, скрипт b.php выдает ошибку 400 - Bad Request при вызове из a.php
Подскажите, в чем может быть проблема? Может конфиги сервера нужно подкрутить?
Заранее благодарен!
Хороший скрипт, тока вот с GET не работает. НЕ много доработал:
заменяем строку:
fwrite($fp, "POST " . (!empty($parts['path']) ? $parts['path'] : '/') . " HTTP/1.1\r\n");
на
зачем такие сложности ?
Добавить комментарий