Using cURL and libcurl with PHP

December 3, 2002

Tutorials

Intended Audience

Overview

Learning Objectives

What are cURL and libcurl?

Installing cURL

A Simple cURL example

Using libcurl within PHP

To cURL or libcurl?

Summary

Resources

About the Author

Intended Audience


This tutorial is intended for PHP programmers and web developers interested in
using their webserver to transfer files or communicate with other servers. You
will need some general knowledge of client-server protocol on the Internet, and
a basic knowledge of PHP syntax.

Overview


cURL and libcurl are libaries that allow a webserver to transfer files with a
remote computer using a variety of Internet protocols. The libaries are highly
configurable, allowing practically any type of client-server request to be peformed.
By using these tools, a webserver can act as a client, creating and responding
to requests using any technology built on HTTP, like XML-RPC, SOAP, or WebDAV.

Learning Objectives

In this tutorial you will learn:


  • What cURL and libcurl
    are
  • How to use cURL on the command
    line
  • How to use libcurl within
    PHP

What are cURL and libcurl?


cURL stands for “Client URLs”, and was developed by Daniel Stenberg in 1998 as
a command line tool. libcurl is a portable library that provides an easy interface
to the cURL functionality. It is thread safe, IPv6 compatible, and supports persistent
connections. The libcurl PHP binding was added by Sterling Hughes.



Both cURL and libcurl can transfer files using a wide variety
of protocols, including HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and
FILE. The libraries run on practically any *NIX operating system, as well as
Windows, OS/2, BeOS, and many more.


The cURL libraries are truly open source, with an MIT/X
derivative license. This license is very liberal, allowing the use of cURL for
whatever you want, commercial or not. You can use libcurl for free, and even
include and distribute it with your own application, whether commercial or
closed-source.


cURL should not to be confused with the Curl Corporation, which is the commercial
producer of the client side programming language, Curl.

Installing cURL


From PHP version 4.2.3 on, you need a cURL version of at least 7.9.0. From PHP
version 4.3.0 on, you need a cURL version of at least 7.9.8.



Windows:

As with any PHP extension in Windows, you will need the PHP
distribution that includes external extensions. Once PHP is installed, you will
need to copy the files php4ts.dll, ssleay32.dll, php_curl.dll, msvcrt.dll from
the ‘DLLs’ folder to your Windows PATH, i.e.:


c:\windows\system for Windows 9x/Me
c:\winnt\system32 for
Windows NT/2000
c:\windows\system32 for Windows XP


cURL can then be enabled by uncommenting the line
‘extension=php_curl.dll’ in the php.ini file. Alternatively you can load the
module dynamically in your script using:

<?php

dl
("php_curl.dll");

?>

Unix:

Your local mirror for downloading cURL can be found at
http://curl.haxx.se. Precompiled binaries are
also available for a wide range of operating systems.

Because cURL relies on the
openssl library for SSL
connections, openssl must be
installed first. If openssl is
not installed, SSL support will be omitted from the cURL build. After
installing cURL (./configure, make, make install), PHP must be recompiled to
include cURL support
(--with-curl).



If cURL support is enabled, the
phpinfo() function will display
it in its output.

A Simple cURL Example


Using cURL from the command line is extremely easy. The following example retrieves
a web page and prints the page to stdout:


curl -L zend.com

(The ‘-L’ tells cURL to follow
redirects.)


Of course, we can execute cURL on the command line using PHP.
The following example does just that, and gets 3 pages at once:


<?php

$var 
= echo shell_exec("/usr/bin/curl -L http://www.zend.com http://zend.com/developers.php http://zend.com/zend/tut/");

?>

Using libcurl with PHP


While using cURL from within PHP is an option, using the libcurl PHP binding is
much easier, especially for things like an HTTP POST operation.


The process of using libcurl from within PHP is a matter of
following these basic steps:

  • Initialize the cURL
    session
  • Set the cURL options (The order of the
    options is not important)
  • Execute the options in
    the cURL session
  • Close the curl
    session

Following this process, here are a few examples demonstrating
HTTP POST, HTTP Authentication, and FTP:


<?php

// FIND BOOKS ON PHP AND MYSQL ON AMAZON

$url "http://www.amazon.com/exec/obidos/search-handle-form/002-5640957-2809605";

$ch curl_init();    // initialize curl handle

curl_setopt($chCURLOPT_URL,$url); // set url to post to

curl_setopt($chCURLOPT_FAILONERROR1);

curl_setopt($chCURLOPT_FOLLOWLOCATION1);// allow redirects

curl_setopt($chCURLOPT_RETURNTRANSFER,1); // return into a variable

curl_setopt($chCURLOPT_TIMEOUT3); // times out after 4s

curl_setopt($chCURLOPT_POST1); // set POST method

curl_setopt($chCURLOPT_POSTFIELDS"url=index%3Dbooks&field-keywords=PHP+MYSQL"); // add POST fields

$result curl_exec($ch); // run the whole process

curl_close($ch); 

echo 
$result;

?>



<?php

// HTTP authentication

$url "http://www.example.com/protected/";

$ch curl_init();    

curl_setopt($chCURLOPT_RETURNTRANSFER1); 

curl_setopt($chCURLOPT_URL$url); 

curl_setopt($chCURLOPT_USERPWD"myusername:mypassword"); 

$result curl_exec($ch); 

curl_close($ch); 

echo 
$result;

?>



<?PHP

// FTP this script to a server

$fp fopen(__FILE__"r");

$url "ftp://username:password@mydomain.com:21/path/to/newfile.php";

$ch curl_init();    

curl_setopt($chCURLOPT_URL$url); 

curl_setopt($chCURLOPT_RETURNTRANSFER1); 

curl_setopt($chCURLOPT_UPLOAD1); 

curl_setopt($chCURLOPT_INFILE$fp); 

curl_setopt($chCURLOPT_FTPASCII1); 

curl_setopt($chCURLOPT_INFILESIZEfilesize(__FILE__)); 

$result curl_exec($ch); 

curl_close($ch); 

?>


Tip: If you are having trouble getting libcurl to do
what you want, add the following code before closing the cURL handle:


<pre

<?
php 

print_r
(curl_getinfo($ch)); 

echo 
"\n\ncURL error number:" .curl_errno($ch); 

echo "\n\ncURL error:" curl_error($ch); 

// ...close cURL handle ($ch) below

?>

</pre>

This will force libcurl to report back on what
happened on the last transfer, making it easier to
troubleshoot.

To cURL or to libcurl?


The decision as to whether to use cURL or libcurl depends on the situation. For
instance, if I have a cron job running that e-mails me when a file changes on
a remote server, or if my ISP doesn’t have libcurl support in their PHP
install, using cURL makes more sense. However, if I have libcurl support in PHP
and I am building a PHP application requiring cURL functionality, libcurl is the
right choice.

Summary


The cURL libraries provide a nice interface for file transfers to and from a webserver.
They have support for a wide variety of protocols (like HTTPS) giving them an
edge over built-in PHP functions like fsockopen(). The libraries
are thread-safe, IPv6 compatible, and will work with any technology that is built
on top of HTTP. Whether you are building simple script to fetch a web page, or
a secure payment gateway, leveraging the functions built into cURL can save a
lot of time.



Resource List

cURL on Sourceforge http://curl.sourceforge.net/

cURL’s man page -
http://curl.sourceforge.net/docs/manpage.html

PHP/cURL Manual -
http://www.zend.com/manual/ref.curl.php

About the Author


Whatever spare time Jim has left after working full-time as a web developer, he
spends developing websites like http://www.fatpigeon.com.
Feel free to send any questions or comments to jthome@fcgov.com


About Cal Evans

Many moons ago, at the tender age of 14, Cal touched his first computer. (We're using the term "computer" loosely here, it was a TRS-80 Model 1) Since then his life has never been the same. He graduated from TRS-80s to Commodores and eventually to IBM PC's. For the past 10 years Cal has worked with PHP and MySQL on Linux OSX, and when necessary, Windows. He has built on a variety of projects ranging in size from simple web pages to multi-million dollar web applications. When not banging his head on his monitor, attempting a blood sacrifice to get a particular piece of code working, he enjoys building and managing development teams using his widely imitated but never patented management style of "management by wandering around". Cal is currently based in Nashville, TN and is gainfully unemployed as the Chief Marketing Officer of Blue Parabola, LLC. Cal is happily married to wife 1.28, the lovely and talented Kathy. Together they have 2 kids who were both bright enough not to pursue a career in IT. Cal blogs at http://blog.calevans.com and is the founder and host of Day Camp 4 Developers

View all posts by Cal Evans

3 Responses to “Using cURL and libcurl with PHP”

  1. _____anonymous_____ Says:

    how to work with cookies and sessinal pages. and can you please explain in more details

  2. _____anonymous_____ Says:

    I am using the curl library to upload the files to a remote host.My problem is that the remote machine does not have the Http window. So that means when i am uploading the file I have to check its preexistence in the directory. Is there a way that can be used to verify the same while doing ftp?
    Thanks

  3. dizyn Says:

    What about using curl with https? can we do this same way we do for http?

    thank you