diff --git a/.gitignore b/.gitignore index edc3de6..6dd4c78 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ Thumbs.db __MACOSX # Project Specific +/vendor/ +composer.lock +.idea/ diff --git a/EpiCurl.php b/EpiCurl.php deleted file mode 100644 index 37d2aa5..0000000 --- a/EpiCurl.php +++ /dev/null @@ -1,212 +0,0 @@ -mc = curl_multi_init(); - $this->properties = array( - 'code' => CURLINFO_HTTP_CODE, - 'time' => CURLINFO_TOTAL_TIME, - 'length'=> CURLINFO_CONTENT_LENGTH_DOWNLOAD, - 'type' => CURLINFO_CONTENT_TYPE, - 'url' => CURLINFO_EFFECTIVE_URL - ); - } - - public function addEasyCurl($ch) - { - $key = $this->getKey($ch); - $this->requests[$key] = $ch; - curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, 'headerCallback')); - $done = array('handle' => $ch); - $this->storeResponse($done, false); - $this->startTimer($key); - return new EpiCurlManager($key); - } - - public function addCurl($ch) - { - $key = $this->getKey($ch); - $this->requests[$key] = $ch; - curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, 'headerCallback')); - - $code = curl_multi_add_handle($this->mc, $ch); - $this->startTimer($key); - - // (1) - if($code === CURLM_OK || $code === CURLM_CALL_MULTI_PERFORM) - { - do { - $code = $this->execStatus = curl_multi_exec($this->mc, $this->running); - } while ($this->execStatus === CURLM_CALL_MULTI_PERFORM); - - return new EpiCurlManager($key); - } - else - { - return $code; - } - } - - public function getResult($key = null) - { - if($key != null) - { - if(isset($this->responses[$key])) - { - return $this->responses[$key]; - } - - $innerSleepInt = $outerSleepInt = 1; - while($this->running && ($this->execStatus == CURLM_OK || $this->execStatus == CURLM_CALL_MULTI_PERFORM)) - { - usleep(intval($outerSleepInt)); - $outerSleepInt = intval(max(1, ($outerSleepInt*$this->sleepIncrement))); - $ms=curl_multi_select($this->mc, 0); - if($ms > 0) - { - do{ - $this->execStatus = curl_multi_exec($this->mc, $this->running); - usleep(intval($innerSleepInt)); - $innerSleepInt = intval(max(1, ($innerSleepInt*$this->sleepIncrement))); - }while($this->execStatus==CURLM_CALL_MULTI_PERFORM); - $innerSleepInt = 1; - } - $this->storeResponses(); - if(isset($this->responses[$key]['data'])) - { - return $this->responses[$key]; - } - $runningCurrent = $this->running; - } - return null; - } - return false; - } - - public static function getSequence() - { - return new EpiSequence(self::$timers); - } - - public static function getTimers() - { - return self::$timers; - } - - private function getKey($ch) - { - return (string)$ch; - } - - private function headerCallback($ch, $header) - { - $_header = trim($header); - $colonPos= strpos($_header, ':'); - if($colonPos > 0) - { - $key = substr($_header, 0, $colonPos); - $val = preg_replace('/^\W+/','',substr($_header, $colonPos)); - $this->responses[$this->getKey($ch)]['headers'][$key] = $val; - } - return strlen($header); - } - - private function storeResponses() - { - while($done = curl_multi_info_read($this->mc)) - { - $this->storeResponse($done); - } - } - - private function storeResponse($done, $isAsynchronous = true) - { - $key = $this->getKey($done['handle']); - $this->stopTimer($key, $done); - if($isAsynchronous) - $this->responses[$key]['data'] = curl_multi_getcontent($done['handle']); - else - $this->responses[$key]['data'] = curl_exec($done['handle']); - - foreach($this->properties as $name => $const) - { - $this->responses[$key][$name] = curl_getinfo($done['handle'], $const); - } - if($isAsynchronous) - curl_multi_remove_handle($this->mc, $done['handle']); - curl_close($done['handle']); - } - - private function startTimer($key) - { - self::$timers[$key]['start'] = microtime(true); - } - - private function stopTimer($key, $done) - { - self::$timers[$key]['end'] = microtime(true); - self::$timers[$key]['api'] = curl_getinfo($done['handle'], CURLINFO_EFFECTIVE_URL); - self::$timers[$key]['time'] = curl_getinfo($done['handle'], CURLINFO_TOTAL_TIME); - self::$timers[$key]['code'] = curl_getinfo($done['handle'], CURLINFO_HTTP_CODE); - } - - static function getInstance() - { - if(self::$inst == null) - { - self::$singleton = 1; - self::$inst = new EpiCurl(); - } - - return self::$inst; - } -} - -class EpiCurlManager -{ - private $key; - private $epiCurl; - - public function __construct($key) - { - $this->key = $key; - $this->epiCurl = EpiCurl::getInstance(); - } - - public function __get($name) - { - $responses = $this->epiCurl->getResult($this->key); - return isset($responses[$name]) ? $responses[$name] : null; - } - - public function __isset($name) - { - $val = self::__get($name); - return empty($val); - } -} - -/* - * Credits: - * - (1) Alistair pointed out that curl_multi_add_handle can return CURLM_CALL_MULTI_PERFORM on success. - */ diff --git a/EpiOAuth.php b/EpiOAuth.php index 6831b33..bb93136 100644 --- a/EpiOAuth.php +++ b/EpiOAuth.php @@ -1,4 +1,11 @@ */ + +namespace jmathai\twitter_async; + +use ArrayAccess; +use ArrayIterator; +use Countable; +use Exception; +use IteratorAggregate; +use jmathai\php_multi_curl\EpiCurl; + class EpiTwitter extends EpiOAuth { const EPITWITTER_SIGNATURE_METHOD = 'HMAC-SHA1'; diff --git a/composer.json b/composer.json index da4d8d5..c0787c0 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,21 @@ { - "name": "jmathai/twitter-async", - "description": "Twitter-async is a high performance wrapper for Twitter's OAuth API which provides parallel/asynchronous calls.", - "homepage": "http://www.jaisenmathai.com/articles/twitter-async-documentation.html", - "author": "Jaisen Mathai", - "license": "BSD" + "name": "jmathai/twitter-async", + "description": "Twitter-async is a high performance wrapper for Twitter's OAuth API which provides parallel/asynchronous calls.", + "homepage": "http://www.jaisenmathai.com/articles/twitter-async-documentation.html", + "author": "Jaisen Mathai", + "license": "BSD", + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/jmathai/php-multi-curl" + } + ], + "require": { + "jmathai/php-multi-curl": ">= 0.1" + }, + "autoload": { + "psr-4": { + "jmathai\\twitter_async\\": "" + } + } } \ No newline at end of file diff --git a/simpleTest.php b/simpleTest.php index 8dfc664..7b122b8 100644 --- a/simpleTest.php +++ b/simpleTest.php @@ -1,7 +1,12 @@