תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

מדריך cURL ב-PHP

מחבר:
בתאריך:

עבודה על צד השרת לא אומרת שכל המידע הנחוץ לנו חייב להימצא במסד הנתונים של האתר שעליו אנחנו עובדים. למעשה, באתרים מודרניים, חלקים הולכים וגדלים מהמידע שבו משתמשים בצד השרת מגיע ממקורות חיצוניים, לרוב באמצעות API המאפשר לגורם מצד שלישי לספק מידע לאתר שלנו גם בלי שתהיה לנו גישה למסד הנתונים על האתר המרוחק. כדי לצרוך את המידע הזה, ניתן להשתמש בהרחבת cURL, שמגיעה כחלק מ-PHP.

cURL היא הרחבת PHP, שמאפשרת לקבל ולשלוח מידע באמצעות תחביר ה-URL. ל-cURL שימושים חשובים ומעניינים שמקלים את התקשורת בין אתרים ודומיינים שונים. במדריך זה אציג 5 דוגמאות שימוש נפוצות ב-cURL:

  1. הורדת התוכן של אתר מרוחק
  2. הורדת קובץ מאתר מרוחק
  3. הגשה אוטומטית של טפסים
  4. הזדהות אוטומטית מול אתר מרוחק
  5. טיפול ב-cookies

 

כיצד cURL עובד?

cURL עובד באמצעות שליחת בקשה לאתר, שכוללת את ארבעת החלקים הבאים:

1. איתחול הבקשה.

$handle = curl_init();

2. הגדרת האופציות. יש אופציות רבות, לדוגמה אופציה שמגדירה את ה-URL:

curl_setopt($handle, CURLOPT_URL, $url);

3. הוצאה לפועל ותפיסת התגובה המוחזרת.

$data = curl_exec($handle);

4. שחרור ידית ה-curl.

curl_close($handle);

 

החלק השני הוא המעניין ביותר מפני שניתן להגדיר באמצעותו בצורה מאוד מדויקת את הבקשה שאנו מעוניינים לשלוח. בהתאם, יש הרבה אופציות, שחלק קטן מהם נראה במדריך.

 

דוגמה ראשונה : כיצד להוריד תוכן של אתר מרוחק לקובץ מקומי?

כדי להוריד את תוכנו של אתר מרוחק נגדיר את האופציות הבאות:

CURLOPT_URL , שמגדיר את ה-URL שאליו אנו מפנים.

CURLOPT_RETURNTRANSFER , מאפשר להציב את המידע שהורדנו מהאתר המרוחק לתוך משתנה. בדוגמה זו, אנו מציבים את המידע לתוך המשתנה $output.

<?php
$handle = curl_init();
 
$url = "//www.ladygaga.com";
 
// Set the url
curl_setopt($handle, CURLOPT_URL, $url);
// Set the result output to be a string.
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
 
$output = curl_exec($handle);
 
curl_close($handle);
 
echo $output;

כשנדפיס את ערך המשתנה $output נוכל לצפות בגרסה המקומית של האתר של הזמרת הכי טובה בעולם.

כיצד האתר שאת תוכנו רוצים להוריד נראה

 

את האופציות ניתן לכתוב באופן קומפקטי יותר באמצעות curl_setopt_array , שמכנס את האופציות לתוך מערך.

curl_setopt_array($handle,
  array(
      CURLOPT_URL            => $url,
      CURLOPT_RETURNTRANSFER => true
  )
);

 

דוגמה שנייה: כיצד להוריד קובץ מאתר מרוחק באמצעות cURL?

ניתן להוריד קובץ מרוחק אל השרת שלנו אם מגדירים את האופציה CURLOPTֹֹ_FILE . לדוגמה, הקוד הבא שמוריד את כל הספר "The Divine Comedy" מפרויקט גוטנברג לתוך הקובץ the_divine_comedy.html שנמצא באותה תיקייה כמו קובץ ה-PHP שלנו :

<?php
// The distant site url.
$url = "//www.gutenberg.org/files/46852/46852-h/46852-h.htm";
// The file on our server.
$file = __DIR__ . DIRECTORY_SEPARATOR . "the_divine_comedy.html";
$handle = curl_init();
 
// Open the file on our server for writing.
$fileHandle = fopen($file, "w");
 
curl_setopt_array($handle,
  array(
     CURLOPT_URL           => $url,
      CURLOPT_FILE => $fileHandle,
  )
);
 
$data = curl_exec($handle);
 
curl_close($handle);
 
fclose($fileHandle);

 

טיפול בתגובה המוחזרת

על מנת לקבל את הפרמטרים של התגובה לצרכי דיבוג ומעקב נגדיר את האופציה CURLOPT_HEADER. לדוגמה:

<?php
$url = ""//www.gutenberg.org/files/41537/41537-h/41537-h.htm";
 
$file = __DIR__ . DIRECTORY_SEPARATOR . "the_divine_comedy.html";
 
$handle = curl_init();
 
$fileHandle = fopen($file, "w");
 
curl_setopt_array($handle,
  array(
    CURLOPT_URL => $url,
    CURLOPT_FILE  => $fileHandle,
    CURLOPT_HEADER => true
  )
);
 
$data = curl_exec($handle);

כדי לחלץ את המידע הנוסף אודות הבקשה, משתמשים בפקודה curl_getinfo שמשמשת אותנו כדי לקבל מידע טכני חשוב אודות התגובה כדוגמת, קוד התגובה (200 לתגובה תקינה) וגודל הקובץ שהורדנו.

$responseCode   = 
curl_getinfo($handle, 
CURLINFO_HTTP_CODE
);
 
$downloadLength = 
curl_getinfo
($handle, 
CURLINFO_CONTENT_LENGTH_DOWNLOAD);

בנוסף, חשוב לקבל הודעות שגיאה בשלב הדיבוג, ולצורך כך משתמשים בפקודות curl_errno ו- curl_error .


if(curl_errno($handle))
{
  print curl_error($handle);
}

כך יראה הקוד המלא:


<?php
$url = "//www.gutenberg.org/files/46852/46852-h/46852-h.htm";
 
$file = __DIR__ . DIRECTORY_SEPARATOR . "the_divine_comedy.html";
 
$handle = curl_init();
 
$fileHandle = fopen($file, "w");
 
curl_setopt_array($handle,
  array(
    CURLOPT_URL    => $url,
    CURLOPT_FILE   => $fileHandle,
    CURLOPT_HEADER => true
  )
);
 
$data = curl_exec($handle);
 
$responseCode   = curl_getinfo($handle, CURLINFO_HTTP_CODE);
 
$downloadLength = curl_getinfo($handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
 
if(curl_errno($handle))
{
  print curl_error($handle);
}
else
{
  if($responseCode == "200") echo "successful request";
 	
  echo " # download length : " . $downloadLength;
 
  curl_close($handle);
 
  fclose($fileHandle);
}

 

דוגמה שלישית: הגשה אוטומטית של טפסים

עד עכשיו למדנו לעשות GET, אבל ניתן לעשות גם POST מה שמאפשר לנו, בין השאר, להגיש טפסים.

כדי להדגים את הגשת הטופס ניצור את שני הקבצים הבאים:

  1. index.php - שיבצע את הcURL.
  2. theForm.php - הקובץ שיכיל את הטופס.

הקובץ theForm.php, יימצא במציאות על שרת מרוחק (אם כי, לצורך הדוגמה, ניתן למקם את שני הקבצים באותו שרת). בדוגמה ישמש טופס ובו 3 שדות: firstName, lastName ו-submit.

<?php
if(isset($_POST["submit"]))
{
  echo "Full name is " . $_POST["firstName"] .
     "  " . $_POST["lastName"];
  exit;
}
?>
 
<html>
<body>
 
<form method = "POST" action = "" >
  <input  name="firstName"  type="text"> 
  <input  name="lastName"  type="text">
  <input  type="submit"  name="submit"  value="שלח" >
</form>
</body>
</html>

כדי להזין את הטופס עלינו להגדיר את שתי האופציות הבאות:

  1. CURLOPT_POST מגדיר שעובדים בפוסט.
  2. CURLOPT_POSTFIELDS , שמקבל מערך (postData$) של השדות שמעוניינים להזין ב-POST. שמות המפתחות במערך הם כשמות (name) של השדות שרוצים להזין.

<?php
$handle = curl_init();
 
$url = "//localhost/curl/theForm.php";
 
// Array with the fields names and values.
// The field names should match the field names in the form.
 
$postData = array(
  'firstName' => 'Lady',
  'lastName'  => 'Gaga',
  'submit'    => 'ok'
);
 
curl_setopt_array($handle,
  array(
     CURLOPT_URL => $url,
     // Enable the post response.
    CURLOPT_POST       => true,
    // The data to transfer with the response.
    CURLOPT_POSTFIELDS => $postData,
    CURLOPT_RETURNTRANSFER     => true,
  )
);
 
$data = curl_exec($handle);
 
curl_close($handle);
 
echo $data;

 

דוגמה רביעית : הזדהות מול אתר באמצעות cURL

כדי להזדהות מול אתר, צריך להגדיר את האופציות הבאות:

  1. CURLOPT_HTTPAUTH
  2. CURLOPT_USERPWD - באמצעותו נגדיר את שם המשתמש והססמה.
  3. CURLOPT_RETURNTRANSFER

וכך נראה הקוד:


curl_setopt_array($handle,
  array(
    CURLOPT_URL => $url,
   CURLOPT_HTTPAUTH => CURLAUTH_ANY,
   CURLOPT_USERPWD  => "$username:$password",
   CURLOPT_RETURNTRANSFER   => true,
  )
);

 

דוגמה חמישית : שימוש ב-COOKIES

שימוש ב-cookies מאפשר לנו להזדהות מול האתר בכל פעם שאנחנו חוזרים אליו. לצורך כך, cURL מספק לנו מנגנון שדרכו אנו יכולים לשמור cookies.

האופציות החשובות ביותר לצורך כך הם :

  1. CURLOPT_COOKIEJAR , שמגדיר את הקובץ שלתוכו צריך לכתוב את ה-cookies.
  2. CURLOPT_COOKIEFILE , שמתוכו קוראים את ה-cookies, כששבים לאתר.

הדוגמה הבאה כותבת את ה-cookies באתר לקובץ cookie.txt, וקוראת ממנו בכל פעם כשחוזרים לאתר.

 

<?php
 
$handle = curl_init();
 
$url = "//www.ladygaga.com/artrave-the-artpop-ball";
 
$file = __DIR__ . DIRECTORY_SEPARATOR . "cookie.txt";
 
curl_setopt_array($handle,
  array(
    CURLOPT_URL => $url,
     // The file to which the cookies need to be written.
    CURLOPT_COOKIEFILE => $file,
    // The file freom which the cookies need to be read.
    CURLOPT_COOKIEJAR  => $file,
    CURLOPT_RETURNTRANSFER     => true,
  )
);
 
$data = curl_exec($handle);
 
curl_close($handle);

 

לסיכום

שימוש בהרחבת cURL של PHP מספקת לנו דרך נוחה להתממשק עם אתרים אחרים ובפרט API שמספק גורם שלישי. במדריך הבא תוכלו ללמוד כיצד ליהעזר ב-cURL כדי למשוך מידע אודות משתמש שמעוניין להירשם לאתר שלכם מרשתות חברתיות.

 

לכל מדריכי ה-PHP

 

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.

למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.

שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.

המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

איך אומרים בעברית אינטרנט?

 

תמונת המגיב

שגיב בתאריך: 22.09.2015

שלום,
בדוגמא השנייה:
יש את השורה: __DIR__ . DIRECTORY_SEPARATOR . [בשם של המתנה file]

לא הבנתי מה זה אומר.
גמר חתימה טובה,
שגיב

תמונת המגיב

יוסי בתאריך: 23.09.2015

DIR זו התיקייה הנוכחית
DIRECTORY_SEPARATOR מפריד בין התיקיות בנתיב שמוביל לקובץ. במקום slash בלינוקס או backslash בחלונות.

שנה טובה.

תמונת המגיב

אנה בתאריך: 10.05.2018

דבר ראשון זה מדריך מדהים!
למדתי ממנו המון.
בנוסף, שאלה: ניסיתי להוריד קבצים מסוג mp4 ו xls אבל קיבלתי ג'יבריש בxls ושגיאה בmp4 מה צריך להוסיף לסקריפט כדי שיוריד נכון את הקבצים?
תודה, אנה