PHP 8.5.0 Beta 3 available for testing

Модуль сетевого обмена данными по URL-адресам

Добавить

Примечания пользователей 10 notes

up
32
frank at interactinet dot com
14 years ago
I wrote the following to see if a submitted URL has a valid http response code and also if it responds quickly.

Use the code like this:

<?php
$is_ok
= http_response($url); // returns true only if http response code < 400
?>

The second argument is optional, and it allows you to check for a specific response code

<?php
http_response
($url,'400'); // returns true if http status is 400
?>

The third allows you to specify how long you are willing to wait for a response.

<?php
http_response
($url,'200',3); // returns true if the response takes less than 3 seconds and the response code is 200
?>

<?php
function http_response($url, $status = null, $wait = 3)
{
$time = microtime(true);
$expire = $time + $wait;

// we fork the process so we don't have to wait for a timeout
$pid = pcntl_fork();
if (
$pid == -1) {
die(
'could not fork');
} else if (
$pid) {
// we are the parent
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE); // remove body
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$head = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if(!
$head)
{
return
FALSE;
}

if(
$status === null)
{
if(
$httpCode < 400)
{
return
TRUE;
}
else
{
return
FALSE;
}
}
elseif(
$status == $httpCode)
{
return
TRUE;
}

return
FALSE;
pcntl_wait($status); //Protect against Zombie children
} else {
// we are the child
while(microtime(true) < $expire)
{
sleep(0.5);
}
return
FALSE;
}
}
?>

Hope this example helps. It is not 100% tested, so any feedback [sent directly to me by email] is appreciated.
up
14
artax_N_O_S_P_A_M_erxes2 at iname dot com
14 years ago
I needed to use cURL in a php script to download data using not only SSL for the server authentication but also for client authentication.
On a default install of Fedora, setting up the proper cURL parameters, I would get an error:

$ php curl.php
Peer certificate cannot be authenticated with known CA certificates

The data on http://curl.haxx.se/docs/sslcerts.html was most useful. Indeed, toward to bottom it tells you to add a missing link inside /etc/pki/nssdb to use the ca-bundle.crt file. You do it so:

# cd /etc/pki/nssdb
# ln -s /usr/lib64/libnssckbi.so libnssckbi.so

Now you can do client authentication, provided you have your certificate handy with:

<?php
$data
= "<soap:Envelope>[...]</soap:Envelope>";
$tuCurl = curl_init();
curl_setopt($tuCurl, CURLOPT_URL, "https://example.com/path/for/soap/url/");
curl_setopt($tuCurl, CURLOPT_PORT , 443);
curl_setopt($tuCurl, CURLOPT_VERBOSE, 0);
curl_setopt($tuCurl, CURLOPT_HEADER, 0);
curl_setopt($tuCurl, CURLOPT_SSLVERSION, 3);
curl_setopt($tuCurl, CURLOPT_SSLCERT, getcwd() . "/client.pem");
curl_setopt($tuCurl, CURLOPT_SSLKEY, getcwd() . "/keyout.pem");
curl_setopt($tuCurl, CURLOPT_CAINFO, getcwd() . "/ca.pem");
curl_setopt($tuCurl, CURLOPT_POST, 1);
curl_setopt($tuCurl, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($tuCurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($tuCurl, CURLOPT_POSTFIELDS, $data);
curl_setopt($tuCurl, CURLOPT_HTTPHEADER, array("Content-Type: text/xml","SOAPAction: \"/soap/action/query\"", "Content-length: ".strlen($data)));

$tuData = curl_exec($tuCurl);
if(!
curl_errno($tuCurl)){
$info = curl_getinfo($tuCurl);
echo
'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
} else {
echo
'Curl error: ' . curl_error($tuCurl);
}

curl_close($tuCurl);
echo
$tuData;
?>
up
12
gmail@asmqb7
9 years ago
WARNING WARNING

In this example: http://php.net/manual/en/book.curl.php#102885 by "frank at interactinet dot com"

There's a small bug in

<?php

...

elseif(
$status == $httpCode)
{
return
TRUE;
}

return
FALSE;
pcntl_wait($status); //Protect against Zombie children
} else {
// we are the child
while(microtime(true) < $expire)

...

?>

The code will immediately leave the function at the `return`, and pcntl_wait() will NEVER be executed, under any circumstances.

I can't see any other issues with this function however.
up
11
artem at zabsoft dot co dot in
16 years ago
Hey I modified script for php 5. Also I add support server auth. and fixed some little bugs on the script.

[EDIT BY danbrown AT php DOT net: Original was written by (unlcuky13 AT gmail DOT com) on 19-APR-09. The following note was included:
Below is the my way of using through PHP 5 objecte oriented encapsulation to make thing easier.]

<?php
class mycurl {
protected
$_useragent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1';
protected
$_url;
protected
$_followlocation;
protected
$_timeout;
protected
$_maxRedirects;
protected
$_cookieFileLocation = './cookie.txt';
protected
$_post;
protected
$_postFields;
protected
$_referer ="http://www.google.com";

protected
$_session;
protected
$_webpage;
protected
$_includeHeader;
protected
$_noBody;
protected
$_status;
protected
$_binaryTransfer;
public
$authentication = 0;
public
$auth_name = '';
public
$auth_pass = '';

public function
useAuth($use){
$this->authentication = 0;
if(
$use == true) $this->authentication = 1;
}

public function
setName($name){
$this->auth_name = $name;
}
public function
setPass($pass){
$this->auth_pass = $pass;
}

public function
__construct($url,$followlocation = true,$timeOut = 30,$maxRedirecs = 4,$binaryTransfer = false,$includeHeader = false,$noBody = false)
{
$this->_url = $url;
$this->_followlocation = $followlocation;
$this->_timeout = $timeOut;
$this->_maxRedirects = $maxRedirecs;
$this->_noBody = $noBody;
$this->_includeHeader = $includeHeader;
$this->_binaryTransfer = $binaryTransfer;

$this->_cookieFileLocation = dirname(__FILE__).'/cookie.txt';

}

public function
setReferer($referer){
$this->_referer = $referer;
}

public function
setCookiFileLocation($path)
{
$this->_cookieFileLocation = $path;
}

public function
setPost ($postFields)
{
$this->_post = true;
$this->_postFields = $postFields;
}

public function
setUserAgent($userAgent)
{
$this->_useragent = $userAgent;
}

public function
createCurl($url = 'nul')
{
if(
$url != 'nul'){
$this->_url = $url;
}

$s = curl_init();

curl_setopt($s,CURLOPT_URL,$this->_url);
curl_setopt($s,CURLOPT_HTTPHEADER,array('Expect:'));
curl_setopt($s,CURLOPT_TIMEOUT,$this->_timeout);
curl_setopt($s,CURLOPT_MAXREDIRS,$this->_maxRedirects);
curl_setopt($s,CURLOPT_RETURNTRANSFER,true);
curl_setopt($s,CURLOPT_FOLLOWLOCATION,$this->_followlocation);
curl_setopt($s,CURLOPT_COOKIEJAR,$this->_cookieFileLocation);
curl_setopt($s,CURLOPT_COOKIEFILE,$this->_cookieFileLocation);

if(
$this->authentication == 1){
curl_setopt($s, CURLOPT_USERPWD, $this->auth_name.':'.$this->auth_pass