Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Curl класс
Форумы портала PHP.SU » PHP » Пользовательские функции » Curl класс

Страниц (1): [1]
 

1. Panoptik - 21 Июля, 2014 - 18:07:20 - перейти к сообщению
стояла задача работать с разными сервисами имитируя работу браузера, то есть логин и выполнение некоторых действий (отправка различных запросов). в результате получилось вот такое дело

Спойлер (Отобразить)


использовал этот объект как свойство класса, и выполнял запросы в различных методах класса, поэтому объект нужен был под рукой и заряжен

инициализация

PHP:
скопировать код в буфер обмена
  1.  
  2. MyClass {
  3.  /**
  4.   * @var CurlRequest
  5.   */
  6.  protected $curl;
  7.  
  8.  public function init() {
  9.      $this->curl = new CurlRequest(array(
  10.             'url' => 'http://site.com'
  11.             'cookieFile' => '/path/to/cookie/file',
  12.         ));
  13.  }
  14.  
  15.  // ... далее в любом методе делаем запросы
  16.  
  17.  public function someAction()  
  18.  {
  19.  
  20.      // post запрос. во втором параметре передаются поля
  21.      // 3 параметр (опциональный) - отправляет заголовок аякс xmlhttprequest
  22.      // 4 параметр (опциональный) - обработает результат как джейсон и вернет декодированные данные
  23.      $json = $this->curl->sendPost('/details/save', array(
  24.             'id' => $id,
  25.             'data' => 'some data',
  26.         ), true, true);
  27.  
  28.     // гет -запрос
  29.     // второй, третий параметры как 3,4 у пост
  30.     $formContent = $this->curl->sendGet('http://site.com', true);
  31.  
  32.    // так же есть возможность послать кастомный запрос с произвольными параметрами курла, но в более удобном (для меня) виде sendRequest
  33.  
  34.  // ну и просто получить ресур курла с предустановленными стандартными опциями
  35.  
  36.   $ch = $this->curl->getCurl($url);
  37.   curl_setopt($ch, ....);
  38.   curl_exec($ch);
  39.   curl_close($ch);
  40.  
  41.  }
  42.  
  43. }
  44.  


так что может кому то пригодится. хотя уверен что в сети полно подобного хлама. но имхо свое было понятней и быстрее
2. teddy - 21 Июля, 2014 - 22:18:49 - перейти к сообщению
а почему свойства url и cookieFile публичные? они ж не используются вне контекста класса, есть смысл объявить их как private. тоже самое касается и метода sendRequest.

Методы класса не будут работать без параметра URL, посему странно то, что данный параметр не является обязательным.

Так же отсутствует возможность применять доп. конфигурацию при отправке запроса, может тебе этих параметров и достаточно а кому то может и нет... слишком все зашито..

Это я ещё не слишком придирался Язычок
3. Panoptik - 21 Июля, 2014 - 22:49:35 - перейти к сообщению
sendRequest как раз специально и создан для доп конфигурации
что касается свойств, то тут дело не страшное

для меня это удобно. так как имеется набор сайтов и соответственно классов с которыми нужно работать вот так

здесь специально отсутствуют кастомные методы. то есть есть просто 4 метода, которые работают и всё. если кому-то нужно, может с легкостью подкрутить под себя или усовершенствовать.

людей часто интересуют вопросы как курлом что-то делать. почему бы не рассмотреть это как пример. при этом этот пример в моем случае приносит непосредственную пользу и работает в живом проекте

ну и отсутствие каких-либо зависимостей делает этот кусок кода вполне самодостаточным и пригодным для использования где угодно
4. armancho7777777 - 23 Июля, 2014 - 18:32:21 - перейти к сообщению
Зачем инициализировать curl каждый раз в методе getCurl ?
Достаточно одного раза в конструкторе.

А в соответствующих методах использовать дискриптор.
PHP:
скопировать код в буфер обмена
  1. // ....
  2. curl_setopt($this->_ch, CURLOPT_URL, $url);

Ну и метод для краткости:
PHP:
скопировать код в буфер обмена
  1. public function setopt($key, $val) {
  2.    curl_setopt($this->_ch, $key, $val);
  3.    return $this;
  4. }
5. Ch_chov - 23 Июля, 2014 - 18:49:44 - перейти к сообщению
Panoptik пишет:
хотя уверен что в сети полно подобного хлама. но имхо свое было понятней и быстрее
Есть такой очень популярный http клиент для PHP с хорошей документацией — Guzzle.
6. Panoptik - 23 Июля, 2014 - 18:52:37 - перейти к сообщению
не встречал ранее.
возьму на заметку

единственное что у меня всего около 100 строк, а там целая пачка.
(Добавление)
armancho7777777
а как на счет контроля за установлением свойств? к примеру у меня выполняется 10 запросов. в середине мне нужно отправить заголовок аякс, а после не отправлять. есть легкий способ следать за включенными оптами?
7. armancho7777777 - 23 Июля, 2014 - 19:01:16 - перейти к сообщению
Реализовать метод "lastRequestUrl"
(Добавление)
Panoptik пишет:
а как на счет контроля за установлением свойств?

Записывать всё в массив в методе setopt и устанавливать опции перед самим запросом.
(Добавление)
PHP:
скопировать код в буфер обмена
  1. public function setopt($key, $val) {
  2.         $this->_options[$key] = $val;
  3.         return $this;
  4.     }


И перед запросом:
PHP:
скопировать код в буфер обмена
  1. curl_setopt_array($this->_ch, $this->_options);

(Добавление)
Panoptik пишет:
в середине мне нужно отправить заголовок аякс

Реализовать метод "setHeader"
(Добавление)
Так же можно реализовать метод "newInit", в котором, например, клонируется текущий объект перезаписывая/сбрасывая определённые свойства/опции.
(Добавление)
Panoptik пишет:
а после не отправлять

Реализовать метод "setOnlyHeader", или "setOnlyOptions"

 

Powered by ExBB FM 1.0 RC1