У меня есть сайт, ориентированный на Ajax, содержание которого заполняется запросами на скрипт PHP-оператора.
Хотя обычно эти запросы исходят из Javascript, бывают случаи, когда полезно запросить мой оператор из другого PHP-скрипта.
Метод, который я использовал, – это передать URL-адрес с строкой запроса через file_get_contents()
а затем проанализировать возвращаемый JSON с помощью json_decode()
.
По нескольким причинам я хотел бы избежать этой реализации, хотя … Я вижу в своих журналах ошибок, что URL-запросы намного более подвержены сбою по любой причине – и я читал, что это не очень эффективно.
Моя query_operator($query_string)
попытка создания общей функции query_operator($query_string)
просто require()
-ed operator.php
в выходном буфере, захваченном ob_get_contents()
. Я также временно сбросил массив $ _REQUEST с параметрами, которые были проанализированы из $query_string
.
Этот подход имел слишком много недостатков – проблемы с переменной областью и соединением MySQL, в частности.
Моя вторая попытка включала использование оператора backtick (эквивалентно shell_exec()
) и сопоставление аргументов $argv
массиву $_REQUEST
.
Этот подход работает очень хорошо, но на хосте, который я использую, версия PHP (cli) установлена в 4.4.8 – и мне нужно 5.2.x. Предполагая, что я не могу переключить версию (cli), каков следующий лучший способ изолировать запрос на другой скрипт PHP с помощью строки запроса? Любые предложения очень ценятся.
Вот моя вторая попытка:
function query_operator($query) { $query = '--'.str_ireplace('&', ' --', $query); $contents = `php operator.php $query`; if ($json = json_decode($contents, true)) { return $json; } else { return $contents; } }
Лучшее, что нужно сделать, в конечном счете, – это фактор вашего кода.
Независимо от того, какая логика operator.php делает, что необходимо, должна жить в некоторой библиотеке, которая затем может использоваться operator.php и любым другим скриптом, который в ней нуждается.
Когда вы это сделаете, вы избежите всех накладных расходов дополнительного процесса PHP, связи между двумя процессами и, вероятно, всего вашего json-encoding / decoding.
Если факторинг слишком занят, то любая из стратегий, которые вы описываете, должна работать как kludge. Возможно, стоит обратить внимание на то, почему ваш метод make-a-loopback-http-request (первое, что вы описали) вызвал ошибки. Это действительно должно хорошо работать, даже если оно неэффективно.