PHPã§æè¿æ³¨ç®ã®HTTPã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªã«Guzzleãããã¾ããæ¥æ¬ã§ã®ç¥å度ã¯ã¾ã ã¾ã ã¨ããå°è±¡ã§ãããããªãé«æ©è½ãã¤çé¢ç®ã«ã¡ã³ããã³ã¹ããã¦ããå°è±¡ã§ãä»å¾ã®ããã¡ã¯ãã¹ã¿ã³ãã¼ãã«ãªãããã©ã¤ãã©ãªã¨è¨ããã§ãããã
æ¬ç¨¿ã§ã¯ãã®Guzzleã使ã£ã¦Webãµã¼ããã並è¡ã«ãã¦ã³ãã¼ãããæ¹æ³ãç´¹ä»ãã¾ããWebãã©ã¦ã¶ã®ããã«åæã«è¤æ°ã³ãã¯ã·ã§ã³ã管çããªããKeep-Aliveã§ã³ãã¯ã·ã§ã³ã使ãåãã¾ãã®ã§ãä¸æãªã³ã¼ãã§å®ç¾ããããæ¥ç¶å
Webãµã¼ãã«ãåªããã¯ãã§ãã
Guzzleã®ç¹å¾´
ã¾ãã¯ãGuzzleã«ã¤ãã¦åãç¹å¾´çã ã¨æãç¹ãç´¹ä»ãã¾ãã
- ããã¨è¦ã§ããããããã¤ã³ã¿ã¼ãã§ã¼ã¹
- cURLã¯å¿ é ã§ã¯ãªããããã©ã«ãã§cURLã使ã
- ã¤ãã³ãããã¯ï¼ãªã¯ã¨ã¹ãã®åå¾ãªã©ã§ããã¯å¯è½ï¼ã®å°å ¥
- Composer対å¿
- ã¯ããã¼ãOAuthããã£ãã·ã¥ããã®ã³ã°ãªã©å¤ãã®ãã©ã°ã¤ã³ãæä¾
æ¬ ç¹ã¯å·¨å¤§ããããã¨ã¨ãããã¥ã¢ã«ã®æ¥æ¬èªè¨³ãã¾ã ç¡ããã¨ãããã§ãããã
Guzzleã®ãã¼ã¸ã§ã³
Guzzleã使ãä¸ã§ãGuzzleã®ãã¼ã¸ã§ã³ã«ã¯è¦æ³¨æã§ããGuzzleã«ã¯Guzzle 3ã¨Guzzle 4ã¨2ã¤ã®ãã¼ã¸ã§ã³ãããã¾ããåãæ©è½ã§ãGuzzle 3ã¨Guzzle 4ã¨ã§ã¡ã½ããåãå¤ãã£ã¦ãããããã®ã§ãæ¤ç´¢ã§è¦ã¤ããè¨äºãèªããããªå ´åã¯æ³¨æãã¦ãã ããã
Guzzle 3ã¨Guzzle 4ã¯ç°ãªããã¼ã ã¹ãã¼ã¹ãå©ç¨ãã¦ãã¾ãã®ã§ãã©ã¡ãã使ã£ã¦ãããã¯ä¸ç®çç¶ã§ããGuzzle 3ã®åå空éã¯ã\Guzzle\ãããå§ã¾ããGuzzle 4ã¯ã\GuzzleHttp\ãããå§ã¾ãã¾ãã
ã¾ããPackagistã§ã®ããã±ã¼ã¸åãGuzzle 3ã¯ãguzzle/guzzleããGuzzle 4+ã¯ãguzzlehttp/guzzleãã¨ãªã£ã¦ãã¾ãã®ã§ãcomposer.jsonã«æ¸ãéã注æãå¿ è¦ã§ãã
Guzzle 4ã¯ä»å¹´ã®3æã«ãªãªã¼ã¹ãããã°ããã§ãããä»ãã使ããªããã¡ãã使ã£ãæ¹ãè¯ãã§ããããæ¬ç¨¿ã§ãGuzzle 4ãå©ç¨ãã¦ãã¾ãã
並è¡ãã¦ã³ãã¼ããããµã³ãã«ã³ã¼ã
Guzzleã®ä¸è¬çãªä½¿ãæ¹ã¯ä»ã®ãã¼ã¸ãè¦ã¦é ãã¨ãã¦ãæ©é並è¡ãã¦ã³ãã¼ãã®ãµã³ãã«ã³ã¼ããç´¹ä»ãã¾ãããã®ã³ã¼ãã¯ã¸ã§ãã¬ã¼ã¿ã使ãããã£ãã®ã§PHP 5.5以éã§ããåä½ãã¾ããããGuzzle 4ã¯PHP 5.4以éã§åãã¯ãã§ãã
<?php use GuzzleHttp\Client; use GuzzleHttp\Event\CompleteEvent; $client = new Client(); $client->sendAll(requests_generator($client), [ 'parallel' => 4, 'complete' => function (CompleteEvent $event) { echo 'Completed request to ' . $event->getRequest()->getUrl() . "\n"; echo 'Response: ' . $event->getResponse()->getBody() . "\n\n"; } ]); function requests_generator($client) { // IDã®è¥ãGitHubã¦ã¼ã¶ã¼20人 $loginIds = [ 'mojombo', 'defunkt', 'pjhyett', 'wycats', 'ezmobius', 'ivey', 'evanphx', 'vanpelt', 'wayneeseguin', 'brynary', 'kevinclark', 'technoweenie', 'macournoyer', 'takeo', 'Caged', 'topfunky', 'anotherjesse', 'roland', 'lukas', 'fanvsfan', ]; foreach ($loginIds as $loginId) { yield $client->createRequest('GET', 'https://github.com/'.$loginId.'.keys'); } }
ããã¯4並åã§github.comã®20URLã¸HTTPSã¢ã¯ã»ã¹ããä¾ã§ããããã§å©ç¨ãã¦ããsendAllã¡ã½ãããä»åã®ãã¢ã§ã並åã«HTTPãªã¯ã¨ã¹ããæããã¡ã½ããã«ãªãã¾ãã第ä¸å¼æ°ã§ãªã¯ã¨ã¹ãã®é
åã¾ãã¯ã¤ãã¬ã¼ã¿ã渡ãã第äºå¼æ°ã®é£æ³é
åã§ä¸¦åæ°ã¨ãªã¯ã¨ã¹ãçµäºæ¯ã«å¼ã°ããã³ã¼ã«ããã¯é¢æ°ãæå®ãããããªã¤ã³ã¿ã¼ãã§ã¼ã¹ã«ãªã£ã¦ãã¾ãã
ãããå®éã«åããã¨ã4ã³ãã¯ã·ã§ã³ãä½ã£ãä¸ã§ãä½ã£ãã³ãã¯ã·ã§ã³ãKeep-Aliveã§ä½¿ãåããªãã並åã«ãªã¯ã¨ã¹ããæãã¦ããã¾ããHTTPSã®å ´åã¯ã³ãã¯ã·ã§ã³ã®ç¢ºç«ã«æéããããã®ã§ããããããã¯ããã¯ãç¹ã«æå¹ã§ãã
ãããå®è¡ãã¦ã¿ãã¨ã¸ã§ãã¬ã¼ã¿ã®é çªã¨ç°ãªãé åºã§çµæãè¿ã£ã¦ãããã¨ãããã¾ãã4並åã®éåæI/Oå¦çã«ãªã£ã¦ãããæ©ãè¿ã£ã¦ããã¬ã¹ãã³ã¹ããé ã«å¦çãããããã§ãããµã³ãã«ã³ã¼ããPHPã¨ããããNode.jsã®æ¹ãè¿ããããã®å°è±¡ã§ãéåæI/Oã£ã½ãã³ã¼ãã¨è¨ããããããã¾ããã
ã¡ãªã¿ã«ãPHPã¯ä»ã®è¨èªã®ããã«éåæI/Oããã¾ãæ±ããããªæ©æ§ã¯ããã¾ããããcURLã¨ã¯ã¹ãã³ã·ã§ã³ã使ãã°HTTPã»HTTPSã«ã¤ãã¦ã®éåæI/Oå¦çã¯ã®ãªã®ãªå®ç¾ã§ãã¾ããGuzzleã§ãå
é¨çã«ã¯curl_multi_inité¢æ°ãcurl_multi_execé¢æ°ãcurl_multi_selecté¢æ°ãªã©ãå©ç¨ãã¦ãã¾ããã¾ããcURLç¡ãã®ç°å¢ã§ã¯ä¸ã®ãµã³ãã«ã³ã¼ãã¯ç´åã«åä½ãã¾ãã
ãã³ããã¼ã¯ãã¹ã
Keep-Aliveã¨ã³ãã¯ã·ã§ã³ãã¼ãªã³ã°ãæå¹ã§ãããã¨ã確èªããæå³ã§ãç°¡æçãªãã³ããã¼ã¯ãã¹ããåã£ã¦ã¿ã¾ããã
å®è¡æé(sec) | |
---|---|
(1) 4並å | 2.2 |
(2) 1並å | 4.7 |
(3) 1並åãKeep-Aliveç¡ã | 22.7 |
(1)ãä¸è¨ã®ãµã³ãã«ã³ã¼ãã§ã(2)ã¯ä¸è¨ã®ããã«curlã³ãã³ãä¸çºã§20URLãåå¾ãããã®ã§ãã
$ curl https://github.com/{mojombo,defunkt,pjhyett,wycats,ezmobius,ivey,evanphx,vanpelt,wayneeseguin,brynary,kevinclark,technoweenie,macournoyer,takeo,Caged,topfunky,anotherjesse,roland,lukas,fanvsfan}.keys
(2)ã¯1æ¥ç¶ãKeep-Aliveã§ä½¿ãåãã¦ããã¨èãããã¾ãããGuzzleã§4並åã«ããæ¹ãå以ä¸éãã¨ããçµæã«ãªãã¾ããã
ã¾ãã(3)ã¯ä¸è¨ã®ããã«foræã§curlã³ãã³ãã20åå¼ã³åºãããã®ã§ãã
$ (for i in https://github.com/{mojombo,defunkt,pjhyett,wycats,ezmobius,ivey,evanphx,vanpelt,wayneeseguin,brynary,kevinclark,technoweenie,macournoyer,takeo,Caged,topfunky,anotherjesse,roland,lukas,fanvsfan}.keys ; do curl $i; done)
å®è£
è
ã®çµé¨ä¸è¶³ãªã©ã§(3)ã®ããã«20åæ¥ç¶ãã¦ã¯æ¥ç¶æããã³ã¼ããæ¸ããå ´åGuzzleã§æ¸ããã10åé
ããªãå¯è½æ§ããããããã§ããæãã§ããã
ã¡ãªã¿ã«ãGuzzleã§æ´ã«ä¸¦åæ°ãä¸ããã¨å¤å°ã¯éããªãã¾ããããã¾ã«æ¥µç«¯ã«é
ããªã£ãããã¦ããã®ã§ãæ大ã§ã6並åãããã«ã¨ã©ãã¦ãããæ¹ãè¯ãããã§ãã
åèè¨äº
- http://guzzlephp.org/ æ¬å®¶ããã¥ã¡ã³ã
- Guzzle 4.0 - mtdowling Guzzle 4.0ãªãªã¼ã¹æã®ããã°è¨äº
- PHP - curl_multiでHTTP並列リクエストを行うサンプル - Qiita