Skip to content

Instantly share code, notes, and snippets.

@mtdowling
Created July 23, 2013 00:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mtdowling/6059009 to your computer and use it in GitHub Desktop.
Save mtdowling/6059009 to your computer and use it in GitHub Desktop.
Simple script to reproduce CURLOPT_READFUNCTION performance issue
<?php
$m = curl_multi_init();
function sendMulti($ch)
{
global $m;
curl_multi_add_handle($m, $ch);
$active = false;
do {
while (($mrc = curl_multi_exec($m, $active)) == CURLM_CALL_MULTI_PERFORM);
if ($active && $mrc === CURLM_OK && curl_multi_select($m) === -1) {
// Perform a usleep if a select returns -1: https://bugs.php.net/bug.php?id=61141
usleep(150);
}
} while ($active);
// Remove done handles
while ($done = curl_multi_info_read($m)) {
curl_multi_remove_handle($m, $done['handle']);
}
}
$loopSize = 10;
$url = 'http://localhost:8124/guzzle-server/perf';
function read() { return 'testing123'; }
function write($ch, $data) { return strlen($data); }
echo "# READFUNCTION\n";
$opts = array(
CURLOPT_RETURNTRANSFER => false,
CURLOPT_HEADER => false,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => array('Expect:', 'Accept:'),
CURLOPT_HEADERFUNCTION => 'write',
CURLOPT_WRITEFUNCTION => 'write',
CURLOPT_UPLOAD => true,
CURLOPT_READFUNCTION => 'read',
CURLOPT_INFILESIZE => 10
);
$t = microtime(true);
$totalUpload = $totalDownload = 0;
for ($i = 0; $i < $loopSize; $i++) {
$ch = curl_init($url);
curl_setopt_array($ch, $opts);
sendMulti($ch);
$totalUpload += curl_getinfo($ch, CURLINFO_SPEED_UPLOAD);
$totalDownload += curl_getinfo($ch, CURLINFO_SPEED_DOWNLOAD);
curl_close($ch);
}
echo (microtime(true) - $t) . " seconds for {$loopSize} requests\n";
echo "Average upload speed: " . ($totalUpload / $loopSize) . "\n";
echo "Average download speed: " . ($totalDownload / $loopSize) . "\n";
echo "\n# POST fields\n";
$opts = array(
CURLOPT_RETURNTRANSFER => false,
CURLOPT_HEADER => false,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => array('Expect:', 'Accept:'),
CURLOPT_HEADERFUNCTION => 'write',
CURLOPT_WRITEFUNCTION => 'write',
CURLOPT_POSTFIELDS => 'testing123'
);
$t = microtime(true);
$totalUpload = $totalDownload = 0;
for ($i = 0; $i < $loopSize; $i++) {
$ch = curl_init($url);
curl_setopt_array($ch, $opts);
sendMulti($ch);
$totalUpload += curl_getinfo($ch, CURLINFO_SPEED_UPLOAD);
$totalDownload += curl_getinfo($ch, CURLINFO_SPEED_DOWNLOAD);
//curl_close($ch);
}
echo (microtime(true) - $t) . " seconds for {$loopSize} requests\n";
echo "Average upload speed: " . ($totalUpload / $loopSize) . "\n";
echo "Average download speed: " . ($totalDownload / $loopSize) . "\n";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment