زيادة استهلاك الذاكرة بعد استعمال guzzle
ZaFaR97 • منذ 6 سنوات
السلام عليكم،
كنت أستعمل curl لإجراء استعلامات http
ومنذ فترة استعملت مكتبة guzzle لإجراء هذه الاستعلامات، الغريب في الأمر أنّ استهلاك الذاكرة (RAM) ارتفع من 45%~50% إلى 80%~90% !
ولم أستطع معرِفة مكان المشكلة.
#تحديث 31/05:
بعض الحسابات التي أجريتُها لمعرفة استهلاك الدّوالّ للذاكرة
#في بداية الدالة وضعت
$start_memory = memory_get_usage();
# وفي نهاية الدالة
$result = memory_get_usage() - $start_memory;
النتيجة كانت لإستعلام واحد بسيط
guzzle: 183.2 kb
curl: 3.81 kb
فرق كبير جدًا جدًا!
البرمجيّة تستعمل api في جميع العمليات، يعني كل عملية لابد من استعلام.
أصغر استعلام بواسطة المكتبة بـ 16kb
بينما بواسطة curl بحجم 232b
guzzle: 6.0
php: 7.2
<?php
# دالة guzzle
$client = new Client( array( 'base_uri' => API_URL, 'timeout' => 60) );
try {
$request = $client->post( $method, ['query' => $parameters]);
} catch (GuzzleHttp\Exception\ClientException $e) {
$http_code = $e->getCode();
if ($http_code >= 500) {
// do not wat to DDOS server if something goes wrong
sleep(5);
error_log($e->getMessage(), 'Warning');
return ['ok' => false, 'error_code' => $http_code, 'description' => "500 level error, method $method, params "
.implode(', ', $parameters)];
}
if ($http_code == 401) {
throw new Exception('Invalid access token provided');
}
$responseBodyAsString = \GuzzleHttp\json_decode($e->getResponse()->getBody()->getContents(), true);
return $responseBodyAsString;
}
return \GuzzleHttp\json_decode($request->getBody()->getContents(), true);
#############################################################################################
# دالة curl
$apiurl = API_URL;
$url = $apiurl.$method.'?'.http_build_query($parameters);
$handle = curl_init($url);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($handle, CURLOPT_TIMEOUT, 60 );
$response = curl_exec($handle);
if ($response === false) {
$errno = curl_errno($handle);
$error = curl_error($handle);
error_log("Curl returned error $errno: $error\n");
curl_close($handle);
return false;
}
$http_code = intval(curl_getinfo($handle, CURLINFO_HTTP_CODE));
curl_close($handle);
if ($http_code >= 500) {
// do not wat to DDOS server if something goes wrong
sleep(5);
return false;
} else if ($http_code != 200) {
$response = json_decode($response, true);
if ($http_code == 401) {
throw new Exception('Invalid access token provided');
}
return false;
} else {
$response = json_decode($response, true);
if (isset($response['description'])) {
error_log("Request was successfull: {$response['description']}\n");
}
$response = $response['result'];
}
return $response;
ساعد بالإجابة
"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !