Я пытаюсь использовать класс HttpRequest, который должен быть в расширении php PECL_HTTP. У меня php5 и для установки pecl_http используется следующее.
sudo pecl install pecl_http pecl/pecl_http is already installed and is the same as the released version 2.0.1 install failed
После этого я вхожу в свой php.ini:
[PHP] extension=http.so [...]
Затем я перезапущу свой сервер apache2 и попробую использовать класс HttpRequest, но он дает мне следующую ошибку:
PHP Fatal error: Class 'HttpRequest' not found
Каковы возможные ошибки, возможно, я пропустил?
UPDATE : (Изменено название)
Расширение не отображается в phpinfo (), я устанавливаю
extension=http.so
И проверил, находится ли файл http.so
в моем extension_dir
. Я действительно не знаю, как заставить php распознавать расширение.
ОБНОВЛЕНИЕ 2 : мне удалось установить расширение, но класс все еще не существует. Для других мне приходилось ссылаться на другие расширения pecl_http. (Для меня: propro.so
, raphfr.so
)
ОБНОВЛЕНИЕ 3 : Мне не удалось сделать класс видимым, ответы ниже показывают некоторые подходы к другим классам.
Я решил эту проблему, используя CURL.
Вы установили новую версию расширения, которая использует совершенно другой API. Я до сих пор не знаю, как это работает, но я уточню свой ответ, который я знаю. Документацию по новой версии можно найти по адресу http://devel-m6w6.rhcloud.com/mdref/http .
Чтобы установить старую версию, сначала удалите новый документ, а затем выполните
pecl install http://pecl.php.net/get/pecl_http-1.7.6.tgz
ОБНОВЛЕНИЕ: вот два примера из документации, оба должны хорошо работать:
один запрос (можно найти по адресу http://devel-m6w6.rhcloud.com/mdref/http/Client/enqueue ):
<?php (new http\Client)->enqueue(new http\Client\Request("GET", "http://php.net"), function(http\Client\Response $res) { printf("%s returned %d\n", $res->getTransferInfo("effective_url"), $res->getResponseCode()); return true; // dequeue })->send();
несколько запросов (можно найти по адресу http://devel-m6w6.rhcloud.com/mdref/http/Client/once ):
<?php $client = new http\Client; $client->enqueue(new http\Client\Request("HEAD", "http://php.net")); $client->enqueue(new http\Client\Request("HEAD", "http://pecl.php.net")); $client->enqueue(new http\Client\Request("HEAD", "http://pear.php.net")); printf("Transfers ongoing"); while ($client->once()) { // do something else here while the network transfers are busy printf("."); // and then call http\Client::wait() to wait for new input $client->wait(); } printf("\n"); while ($res = $client->getResponse()) { printf("%s returned %d\n", $res->getTransferInfo("effective_url"), $res->getResponseCode()); }
В обоих примерах вы можете использовать $res->getBody()
чтобы вернуть тело ответа.
Я не мог проверить эти примеры, но я слышал о других людях, что они работают.
У меня была такая же проблема, и я решил ее, упорядочив порядок, в котором расширения загружаются в php.ini
Все мои другие расширения были загружены с использованием собственных .ini-файлов в /etc/php5/mods_available
. В моем apache2 error.log
я заметил, что json_decode
был необходим http.so
для загрузки.
Я создал файл для http (http.ini) и символическую ссылку в /etc/php5/apache/conf.d
с более высоким префиксом, чем json.
мой http.ini
; configuration for php http module ; priority=50 extension=raphf.so extension=propro.so extension=http.so
используйте новый pecl_http.2.0.6, как это
new http\Message();
или расширяться в вашем собственном классе, поскольку расширяет http \ Message