زيادة استهلاك الذاكرة بعد استعمال guzzle

ZaFaR97 • منذ 5 سنوات

السلام عليكم،

كنت أستعمل 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

رسم بيانيّ يظهر الارتفاع المستمر
لاحظ الارتفاع بعد تاريخ 9، يوم التحديث مباشرة
<?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;

 

كلمات دليلية: guzzle memory php ram

ساعد بالإجابة

"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !