#
國外的開源技術也影響和推動了國內開源程序的發展,上文我介紹的《國外優秀開源PHP建站程序一覽》中,很多國外開源程序并不太符合中國人的使用習慣,而國內有一些廠家或個人也做了一些不錯的產品,不少程序是提供源代碼下載的,雖然有些在許可協議上和開源許可證有些出入,但其在使用上還是挺符合中國人的使用習慣,今天我就介紹一些國內的PHP“開源”建站程序。
論壇:Discuz
Discuz非常流行,也是中國地區最多用戶使用的論壇程序,論壇搭建非常簡單易用,使用風格符合中國人的口味。另一個流行的論壇程序是PHPWind。
SNS:Ucenter Home
UCenter Home是采用PHP+MySQL構建的社會化網絡軟件(Social Network Software,簡稱SNS)。 通過 UCenter Home,建站者可以輕松構建一個以好友關系為核心的交流網絡,用戶可以使用迷你博客記錄;方便快捷地發布日志、上傳圖片;與其好友們一起分享信息、討論話題;了解好友最新動態。
E-Commerce:ECSHOP
ECSHOP是一款開源免費的網上商店系統,用戶可以根據自己的商務特征對ECSHOP進行定制,增加自己商城的特色功能。另一個流行的網上商城系統是shopex。
點評:Modoer
Modoer一款PHP點評系統,可針對多種行業進行點評,可以自由調控點評項目,類型,采用Web 2.0的建站方式,網站會員能讓快速上手。
Digg:PBDigg
PBDigg是基于PHP+MYSQL的開源Digg社區資訊系統,融合了社會性標簽、主題評論、Rss訂閱等多種WEB2.0元素,是一個高效、快速的網站解決方案。
Wiki:HDWiki
HDWiki是專為中文用戶設計和開發的開源、高效的中文百科建站解決方案,免費、易用、功能強大,和UCenter可無縫整合。
RSS:IXNA
IXNA是國內開源PHP新聞聚合程序,支持RSS多核心切換,默認支持lastrss、simplepie、magpierss,支持RDF、RSS、ATOM,支持智能識別。
CMS:關于CMS的PHP產品很多,這里主要介紹下面三個。
SupeSite
SupeSite 是一套獨立的內容管理系統(CMS),并且擁有對Discuz!論壇信息和UCenter Home個人空間信息聚合的功能,是一個不錯的社區門戶解決方案。
DedeCMS
DedeCMS是一個比較老的PHP CMS系統,很多早期的用戶都是使用這個建立網站的。
KingCMS
KingCMS是一套簡單易學,操作簡單的開源內容管理系統(CMS),KingCMS分為PHP+MySQL和ASP+MSSQL/ACCESS兩種語言版本的系統。
最后是一次快訊,Twitter又無法訪問了,估計XJ那里完事后可能會恢復,現在的解決方法在這里。
大量的PHP開源(開放源代碼/Open Source)應用改變了這個世界,改變了互聯網,以下我們總結從數據庫到購物、博客等眾多類型的開源PHP軟件,供網站開發者們參考。
博客:WordPress
WordPress是使用PHP開發的著名博客平臺,免費開源,功能強大,不僅僅用于博客搭建,還可以廣泛應用于各類網絡信息發布平臺。
論壇:phpBB
phpBB是一種廣泛流行的開源論壇軟件,具有易于使用的管理面板和友好的用戶安裝界面,可以輕松地在數分鐘內建立起一個論壇,功能上具有很高的可配置性,能夠完全定制出相當個性化的論壇。
CMS:Drupal
Drupal是一個開源的內容管理系統(CMS)平臺,擁有強大并可自由配置的功能,能支持從個人博客到大型社區驅動的網站等各種不同應用的網站項目。
Wiki:MediaWiki
MediaWiki是PHP語言寫成開源Wiki引擎,全世界最大的Wiki項目維基百科就是使用MediaWiki引擎。
Digg:Pligg
Pligg是一套靈活的類似Digg的Web2.0 CMS系統,系統使用PHP開發,模仿了國外流行的DIGG系統。
圖像:Gallery
Gallery 是一個非常有名的免費開源圖庫相冊軟件,基于 PHP 和 MySQL, PostgreSQL 等數據庫。功能非常強大,有豐富的擴展可以下載,安裝很簡單,有很多插件可用。
RSS:Gregarius
Gregarius是一個RSS聚合程序,免費開源,具備不錯的用戶體驗,易于操作和管理。可以把其當成RSS閱讀器使用。
電子商務:osCommerce
osCommerce是一套由自由軟件開發社團開發并維護的在線商店的解決方案,免費開源,并可以應用到任何的商業環境中,可以在短時間內生成一個功能強大的電子商務網站。
廣告:OpenX
OpenX(原名phpAdsNew)是一個用PHP開發的廣告管理與跟蹤系統,適合各類網站使用,能夠管理每個廣告主擁有的多種任何尺寸橫幅廣告,按天查看,詳細和概要統計并通過電子郵件發送報表給廣告主。
微博客:Laconica
Laconica是一個開源的微型博客系統,也是一個Twitter克隆,可以實現Microblog的常用功能,國外不少微博客系統都是通過這個開源系統架設的。
英文原文:Top Ten Open Source PHP Apps
1 JS方式調用PHP文件并取得php中的值
舉一個簡單的例子來說明:
如在頁面a.html中用下面這句調用:
<script type="text/javascript" src="b.php?action=test"></script>
<script type="text/javascript" >
alert(jstext);
</script>
在b.php中有這樣一段PHP代碼:
<? $action=$_GET['action']; //echo "var jstext='$action'"; //輸出一句JS語句,生成一個JS變量,并賦顛值為PHP變量 $action的值 //echo "var jstext='aa'"; echo "var jstext="."'$action'"; ?>
當執行a.html文件時,就會調用b.php文件,并將b.php文件的輸出作為JS語句來執行,所以此處會彈出一個提示框,內容為JS變量jstext的值,也就是在PHP文件中賦給jstext的值.
小結:
在HTML里用JS 調用文件的方式調PHP文件,則PHP文件的輸出將會被調用頁作為JS的代碼來用.
2 php調用js中的值
在z.php頁面中有這樣一段代碼:
<script type="text/javascript" > var url="aaaa*"; </script> <? $key="<script type=text/javascript>document.write(url)</script>"; echo $key; ?>
3 php調用js中的方法(函數)
<script type="text/javascript"> function test() { var t1=3; t1 = t1+2; alert(t1); //return t1; } </script>
<?php echo "<script type='text/javascript'>test();</script>"; ?>
4 JS調用PHP變量
(1)
<?php
$userId=100;
?> <script>
var userId;
userId=document.getElementByIdx_x_x_x("userId").value;
alert (userId);
</script>
<input type="text" name="userId" id="userId" value="<?php echo $userId; ?>">
(2)
<?php
$url = '變化的網址'; //定義變量
?>
<script type="text/javascript">
//js調用php變量
var ds ="<?php echo $url?>" ; //賦值 alert(ds); //輸出效果 </script>
5 -------------------------------
<script language="JavaScript"> <!--
var Y=<?php echo date('Y')?>,M=<?php echo date('n')?>,D=<?php echo date('j')?>;
-->
</script>
6 自己寫的js和php互相調用
1.php內容:
<?php
//echo "<script LANGUAGE='javascript'>alert('$php變量');</script>"; //最簡單的php調用js
//echo "<a href=#><img width=50 src='$fruit_pic_array[$i]' onMouseOver=’javascript:a();‘></a>";
//echo "<a href='3.php'>aaaa</a>"; //php中超鏈接
//echo "<script type='text/javascript' language='javascript'>phpmake('PHP建站學習筆記網');</script>"; //有時候需要在PHP執行過程中,需要調用JavaScript自定義函數(驗證時出錯)
echo "function ok(msg){alert(msg);}";
?>
<HTML>
<HEAD>
<TITLE> php調用js文件的好辦法</TITLE>
</HEAD>
<BODY>
<!--js調用php中定義的js-->
<scrīpt language=''javascrīpt'' type=''text/javascrīpt'' src=''1.php''></scrīpt>
<scrīpt>
ok("aaaaaa!");
</scrīpt>
</script>
</BODY>
</HTML>
2.php內容:
<!--js調用php-->
<?php
$userId=100;
?>
<script>
var userId;
userId=document.getElementByIdx_x("userId").value;
alert (userId);
</script>
<input type="text" name="userId" id="userId" value="<?php echo $userId; ?>">
<!--js調用php-->
<?php
if($_GET["action"]=="ok")
{
echo "I'm OK!";
}
else
{
echo "I'm not OK!";
}
?>
<SCRIPT Language = "JavaScript">
function func()
{
if(confirm("Are you OK with this?"))
{
this.location = "ok.php?action=ok";
}
else
{
this.location = "ok.php?action=cancel";
}
}
</SCRIPT>
<html>
<head>
</head>
<body>
<a href="#" href="#" onClick="javascript:func();">Please Click</a>
</body>
</html>
<!--js調用php-->
<html>
<head>
<script>
function isMail(PostString)
{
re=/\w*/
if(re.test(PostString))
{
return true;
}
else
{
return false;
}
}
function test(){
if (isMail(<?php echo $email?>))
{document.write("<?php echo "N";?>");}
else
{document.write('<?php echo 'Y';?>');}
}
</script>
</head>
<body>
<?php
$email="aa";
?>
<input type=button value=click onclick= 'test() '>
</body>
</html>
<!--php中含有js代碼-->
<?php
echo "
<script language=javascript>
function test(){
alert( 'hello ');
}
</script> ";
?>
<input type=button value=click onclick= 'test() '>
摘要: 下面的例子列出幾種情形交互場景,列出JS和php交互的方法。總結下,以免日后再為cookie問題困擾。setcookie.php01<?php02 setcookie('php_cn_ck','php_中文_cookie');03 setcookie('php_en_ck','php_english_...
閱讀全文
<?php
/**
* Socket版本
* 使用方法:
* $post_string = "app=socket&version=beta";
* request_by_socket('facebook.cn','/restServer.php',$post_string);
*/
function request_by_socket($remote_server,$remote_path,$post_string,$port = 80,$timeout = 30){
$socket = fsockopen($remote_server,$port,$errno,$errstr,$timeout);
if (!$socket) die("$errstr($errno)");
fwrite($socket,"POST $remote_path HTTP/1.0\r\n");
fwrite($socket,"User-Agent: Socket Example\r\n");
fwrite($socket,"HOST: $remote_server\r\n");
fwrite($socket,"Content-type: application/x-www-form-urlencoded\r\n");
fwrite($socket,"Content-length: ".strlen($post_string)+8."\r\n");
fwrite($socket,"Accept:*/*\r\n");
fwrite($socket,"\r\n");
fwrite($socket,"mypost=$post_string\r\n");
fwrite($socket,"\r\n");
$header = "";
while ($str = trim(fgets($socket,4096))) {
$header.=$str;
}
$data = "";
while (!feof($socket)) {
$data .= fgets($socket,4096);
}
return $data;
}
/**
* Curl版本
* 使用方法:
* $post_string = "app=request&version=beta";
* request_by_curl('http://facebook.cn/restServer.php',$post_string);
*/
function request_by_curl($remote_server,$post_string){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$remote_server);
curl_setopt($ch,CURLOPT_POSTFIELDS,'mypost='.$post_string);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_USERAGENT,"Jimmy's CURL Example beta");
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
/**
* 其它版本
* 使用方法:
* $post_string = "app=request&version=beta";
* request_by_other('http://facebook.cn/restServer.php',$post_string);
*/
function request_by_other($remote_server,$post_string){
$context = array(
'http'=>array(
'method'=>'POST',
'header'=>'Content-type: application/x-www-form-urlencoded'."\r\n".
'User-Agent : Jimmy\'s POST Example beta'."\r\n".
'Content-length: '.strlen($post_string)+8,
'content'=>'mypost='.$post_string)
);
$stream_context = stream_context_create($context);
$data = file_get_contents($remote_server,FALSE,$stream_context);
return $data;
}
function curl_file_get_contents($durl) {
$ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, $durl ); curl_setopt ( $ch, CURLOPT_POST, 1 ); curl_setopt ( $ch, CURLOPT_TIMEOUT, 5 ); curl_setopt ( $ch, CURLOPT_USERAGENT, _USERAGENT_ ); curl_setopt ( $ch, CURLOPT_REFERER, _REFERER_ ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); $r = curl_exec ( $ch ); curl_close ( $ch ); return $r; }
php讀取網絡文件 curl, fsockopen ,file_get_contents 幾個方法的效率對比
最近需要獲取別人網站上的音樂數據。用了file_get_contents函數,但是總是會遇到獲取失敗的問題,盡管按照手冊中的 例子設置了超時,可多數時候不會奏效:
$config['context'] = stream_context_create(array(‘http’ => array(‘method’ => “GET”, ’timeout’ => 5//這個超時時間不穩定,經常不奏效 ) ));這時候,看一下服務器的連接池,會發現一堆類似的錯誤,讓我頭疼萬分:file_get_contents(http://***): failed to open stream…現在改用了curl庫,寫了一個函數替換:function curl_file_get_contents($durl){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $durl); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_); curl_setopt($ch, CURLOPT_REFERER,_REFERER_); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $r = curl_exec($ch); curl_close($ch); return $r;}如此,除了真正的網絡問題外,沒再出現任何問題。這是別人做過的關于curl和file_get_contents的測試:file_get_contents抓取google.com需用秒數:
2.31319094
2.303742172.215126043.305538892.30124092curl使用的時間:
0.68719101
0.646755930.643260.819831130.63956594差距很大?呵呵,從我使用的經驗來說,這兩個工具不只是速度有差異,穩定性也相差很大。建議對網絡數據抓取穩定性要求比較高的朋友使用上面的 curl_file_get_contents函數,不但穩定速度快,還能假冒瀏覽器欺騙目標地址哦!
看到的其他文章收藏于此===============================
php fsockopen
方法1: 用file_get_contents 以get方式獲取內容
<?php
$url='http://www.domain.com/';
$html = file_get_contents($url);
echo $html;
?>
方法2: 用fopen打開url, 以get方式獲取內容
<?php
$fp = fopen($url, 'r');
stream_get_meta_data($fp);
while(!feof($fp)) {
$result .= fgets($fp, 1024);
}
echo "url body: $result";
fclose($fp);
?>
方法3:用file_get_contents函數,以post方式獲取url
<?php
$data = array ('foo' => 'bar');
$data = http_build_query($data);
$opts = array (
'http' => array (
'method' => 'POST',
'header'=> "Content-type: application/x-www-form-urlencoded\r\n" .
"Content-Length: " . strlen($data) . "\r\n",
'content' => $data
)
);
$context = stream_context_create($opts);
$html = file_get_contents('http://localhost/e/admin/test.html', false, $context);
echo $html;
?>
方法4:用fsockopen函數打開url,以get方式獲取完整的數據,包括header和body
<?php
function get_url ($url,$cookie=false)
{
$url = parse_url($url);
$query = $url[path]."?".$url[query];
echo "Query:".$query;
$fp = fsockopen( $url[host], $url[port]?$url[port]:80 , $errno, $errstr, 30);
if (!$fp) {
return false;
} else {
$request = "GET $query HTTP/1.1\r\n";
$request .= "Host: $url[host]\r\n";
$request .= "Connection: Close\r\n";
if($cookie) $request.="Cookie: $cookie\n";
$request.="\r\n";
fwrite($fp,$request);
while()) {
$result .= @fgets($fp, 1024);
}
fclose($fp);
return $result;
}
}
//獲取url的html部分,去掉header
function GetUrlHTML($url,$cookie=false)
{
$rowdata = get_url($url,$cookie);
if($rowdata)
{
$body= stristr($rowdata,"\r\n\r\n");
$body=substr($body,4,strlen($body));
return $body;
}
return false;
}
?>
方法5:用fsockopen函數打開url,以POST方式獲取完整的數據,包括header和body
<?php
function HTTP_Post($URL,$data,$cookie, $referrer="")
{
// parsing the given URL
$URL_Info=parse_url($URL);
// Building referrer
if($referrer=="") // if not given use this script as referrer
$referrer="111";
// making string from $data
foreach($data as $key=>$value)
$values[]="$key=".urlencode($value);
$data_string=implode("&",$values);
// Find out which port is needed - if not given use standard (=80)
if(!isset($URL_Info["port"]))
$URL_Info["port"]=80;
// building POST-request:
$request.="POST ".$URL_Info["path"]." HTTP/1.1\n";
$request.="Host: ".$URL_Info["host"]."\n";
$request.="Referer: $referer\n";
$request.="Content-type: application/x-www-form-urlencoded\n";
$request.="Content-length: ".strlen($data_string)."\n";
$request.="Connection: close\n";
$request.="Cookie: $cookie\n";
$request.="\n";
$request.=$data_string."\n";
$fp = fsockopen($URL_Info["host"],$URL_Info["port"]);
fputs($fp, $request);
while(!feof($fp)) {
$result .= fgets($fp, 1024);
}
fclose($fp);
return $result;
}
?>
方法6:使用curl庫,使用curl庫之前,可能需要查看一下php.ini是否已經打開了curl擴展
<?php
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, 'http://www.domain.com/');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
echo $file_contents;
?>
php中 curl, fsockopen ,file_get_contents 三個函數 都可以實現采集模擬發言 。 三者有什么區別,或者講究么
趙永斌:
有些時候用file_get_contents()調用外部文件,容易超時報錯。換成curl后就可以.具體原因不清楚
curl 效率比file_get_contents()和fsockopen()高一些,原因是CURL會自動對DNS信息進行緩存(亮點啊 有我待親測)
范佳鵬:
file_get_contents curl fsockopen
在當前所請求環境下選擇性操作,沒有一概而論:
具我們公司開發KBI應用來看:
剛開始采用:file_get_contents
后來采用:fsockopen
最后到至今采用:curl
(遠程)我個人理解到的表述如下(不對請指出,不到位請補充)
file_get_contents 需要php.ini里開啟allow_url_fopen,請求http時,使用的是http_fopen_wrapper,不會keeplive.curl是可以的。
file_get_contents()單個執行效率高,返回沒有頭的信息。
這個是讀取一般文件的時候并沒有什么問題,但是在讀取遠程問題的時候就會出現問題。
如果是要打一個持續連接,多次請求多個頁面。那么file_get_contents和fopen就會出問題。
取得的內容也可能會不對。所以做一些類似采集工作的時候,肯定就有問題了。
sock較底層,配置麻煩,不易操作。 返回完整信息。
潘少寧-騰訊:
file_get_contents 雖然可以獲得某URL的內容,但不能post get啊。
curl 則可以post和get啊。還可以獲得head信息
而socket則更底層。可以設置基于UDP或是TCP協議去交互
file_get_contents 和 curl 能干的,socket都能干。
socket能干的,curl 就不一定能干了
file_get_contents 更多的時候 只是去拉取數據。效率比較高 也比較簡單。
趙的情況這個我也遇到過,我通過CURL設置host 就OK了。 這和網絡環境有關系
首先說下啥是socket:
php使用berkely的socket庫來創建他的連接,socket是一個數據結果,你可以通過這個socket來開啟服務器和客戶端的會話。服務器端一直處于監聽狀態,當一個客戶端連接服務器,他就打開服務器端正在監聽的一個端口進行會話。這時服務器端接收客戶端的連接請求,那么就進行一次循環。現在這個客戶端就能夠發送信息到服務器,服務器也可以發送信息給客戶端。
產生一個socket你一共需要三個變量:
1、一個協議
2、一個socket類型
3、一個公共協議類型
以下是對這三個變量的詳細解釋,大概了解下吧
協議:產生一個socket有三個協議供選擇:
1、AF_INET 這個是使用比較廣泛的產生socket的協議,使用tcp或者udp協議傳輸,使用ipv4地址
2、AF_INET6 顯而易見哈,同上,不同的是使用ipv6地址
3、AF_UNIX 使用在unix或者linux機器上,這個很少使用,僅在服務器端和客戶端均為unix或者linux系統上使用。
socket類型:
1、SOCK_STREAM 這個協議是按照順序的、可靠的、數據完整的基于字節流的連接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。
2、SOCK_DGRAM 這個協議是無連接的、固定長度的傳輸調用。該協議是不可靠的,使用UDP來進行它的連接。
3、SOCK_SEQPACKET 這個協議是雙線路的、可靠的連接,發送固定長度的數據包進行傳輸。必須把這個包完整的接受才能進行讀取。
4、SOCK_RAW 這個socket類型提供單一的網絡訪問,這個socket類型使用ICMP公共協議。(ping、traceroute使用該協議)
5、SOCK_RDM 這個類型是很少使用的,在大部分的操作系統上沒有實現,它是提供給數據鏈路層使用,不保證數據包的順序
公共協議類型:
1、ICMP (Internet Control Message Protocol)互聯網控制報文協議,主要用在網關和主機上,用來檢測網絡狀況和報告錯誤信息
2、TCP (Transmission Control Protocol) 傳輸控制協議,他是使用最廣泛的協議,他能夠保證數據包到達接收者那里,如果中途出現錯誤,那么此協議從新發送數據包。
3、UDP (User Datagram Protocol)用戶數據包協議,他是無連接的,不可靠的數據傳輸協議。
好啦,你現在知道了產生一個socke需要三個元素,那么在php中socket_create()就需要三個參數,一個協議,一個socket類型,一個公共協議。如果創建成功,socket_create()返回一個socket資源類型,如果不成功,嘿嘿,那你會收到一個false.
CURL
cURL 是利用URL語法規定來傳輸文件和數據的工具。他支持HTTP、FTP、TELNET。
為啥要使用cURL呢?
因為,如果我們有時候想靈活的獲取網頁上的內容,例如處理coockies、驗證、表單提交、文件上傳等等等等。那么你就需要用到cURL.據說php有著功能強大的cURL庫(因為偶也說不清強大在哪里啦,
php使用cURL的選項基本步驟如下:
1、初始化
2、參數設置
3、頁面內容獲取或者操作
4、釋放句柄
看看下面這個簡單的例子吧。
<?php
//初始化curl
$ch = curl_init ();
/*
* 設置curl
* php手冊對于curl_setopt的解釋為:設置對于curl傳輸的操作
* curl_setopt有三個參數:資源(一般為你建立的curl句柄)、操作(你將對這個句柄作何操作)、參數(對于這個操作你給出的參數)
*/
//例如你想對百度進行某些操作
curl_setopt ( $ch, CURLOPT_URL, "http://www.baidu.com");
//現在看來你要向百度post數據
curl_setopt ( $ch, CURLOPT_POST, 1 );
/*給出了要post的數據:$post_string,post的數據可以是一個文件,
*那么你需要以@加上文件的全路徑給出,或者你要post一些數據,
*那么你可以按照數組形式給出,或者按照字符串給出,
*如果你想按照字符串形式給出,請把字符串urlencode,嘿嘿
*/
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_string );
/*
*把curl操作的結果以字符串形式 從curl_exec ()返回,而不是直接就輸出了
*/
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
//得到操作返回結果
$result = curl_exec ( $ch );
//關閉curl句柄
curl_close ( $ch );
?>
因為php的curl有很多操作,要都記住估計很困難,反正偶記不住啦,說些大家可能用的上的吧。大笑
獲取服務器的一些信息
[php] view plaincopy
<?php
//初始化curl
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, "http://www.baidu.com");
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_exec($ch);
$info = curl_getinfo($ch);
var_dump($info);
?>
通過上面的例子,你將會獲得如下信息:
“url” //資源網絡地址
“content_type” //內容編碼
“http_code” //HTTP狀態碼
“header_size” //header的大小
“request_size” //請求的大小
“filetime” //文件創建時間
“ssl_verify_result” //SSL驗證結果
“redirect_count” //跳轉技術
“total_time” //總耗時
“namelookup_time” //DNS查詢耗時
“connect_time” //等待連接耗時
“pretransfer_time” //傳輸前準備耗時
“size_upload” //上傳數據的大小
“size_download” //下載數據的大小
“speed_download” //下載速度
“speed_upload” //上傳速度
“download_content_length”//下載內容的長度
“upload_content_length” //上傳內容的長度
“starttransfer_time” //開始傳輸的時間
“redirect_time”//重定向耗時
利用curl你還可以做以下操作:
模擬頁面的post操作
文件上傳
HTTP 認證
FTP 上傳
回調函數
以上關于curl的大前提是你的php在安裝編譯時加了 --with-curlwrappers ,你可以通過phpinfo()操作來查看你是不是在編譯時加了這個擴展庫。
如果加載了這個擴展,你將能看見類似:
如果你沒有這個擴展,你需要改一下php.ini文件,去掉extension=php_curl.dll前面的分號。
好啦,現在我們知道socket和curl是咋回事了,socket是一種數據結構,他可以用來在服務器和客戶端進行對話。而curl是利用url語法規定來傳輸文件和數據的規定,支持很多協議,例如FTP,HTTP、TELNET等。
抓取遠程內容,之前一直都在用file_get_content函數,其實早就知道有curl這么一個好東西的存在,但是看了一眼后感覺使用頗有些復雜,沒有file_get_content那么簡單,再就是需求也不大,所以沒有學習使用curl。
直到最近,要做一個網頁小偷程序的時候才發現file_get_content已經完全不能滿足需求了。我覺得,在讀取遠程內容的時候,file_get_content除了使用比curl便捷以外,其他都沒有curl好。
php中curl和file_get_content的一些比較
主要區別:
學習才發現,curl支持很多協議,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP,也就是說,它能做到很多file_get_content做不到的事情。curl在php可以實現遠程獲取和采集內容;實現PHP網頁版的FTP上傳下載;實現模擬登陸;實現接口對接(API),數據傳輸;實現模擬Cookie;下載文件斷點續傳等等,功能十分強大。
了解curl一些基本的使用后,才發現其實并不難,只不過記住里面一些設置參數,難弄一點,但是我們記住幾個常用的就可以了。
開啟curl:
因為PHP默認是不支持curl功能的,因此如果要用curl的話,首先需要在php.ini中開啟該功能,即去掉 ;extension= php_curl.dll 前面的分號,然后保存后重啟apache/iis就好了。
基本語法:
$my_curl = curl_init(); //初始化一個curl對象
curl_setopt($my_curl, CURLOPT_URL, "http://www.jb51.net"); //設置你需要抓取的URL
curl_setopt($my_curl,CURLOPT_RETURNTRANSFER,1); //設置是將結果保存到字符串中還是輸出到屏幕上,1表示將結果保存到字符串
$str = curl_exec($curl); //執行請求
echo $str; //輸出抓取的結果
curl_close($curl); //關閉url請求
最近需要獲取別人網站上的音樂數據。用了file_get_contents函數,但是總是會遇到獲取失敗的問題,盡管按照手冊中的例子設置了超時,可多數時候不會奏效:
$config['context'] = stream_context_create(array('http' => array('method' => "GET",
'timeout' => 5//這個超時時間不穩定,經常不奏效
)
));
這時候,看一下服務器的連接池,會發現一堆類似的錯誤,讓我頭疼萬分:
file_get_contents(http://***): failed to open stream…
現在改用了curl庫,寫了一個函數替換:
function curl_file_get_contents($durl){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $durl);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
curl_setopt($ch, CURLOPT_REFERER,_REFERER_);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$r = curl_exec($ch);
curl_close($ch);
return $r;
}
如此,除了真正的網絡問題外,沒再出現任何問題。
這是別人做過的關于curl和file_get_contents的測試:
file_get_contents抓取google.com需用秒數:
2.31319094
2.30374217
2.21512604
3.30553889
2.30124092
curl使用的時間:
0.68719101
0.64675593
0.64326
0.81983113
0.63956594
差距很大?呵呵,從我使用的經驗來說,這兩個工具不只是速度有差異,穩定性也相差很大。
建議對網絡數據抓取穩定性要求比較高的朋友使用上面的 curl_file_get_contents函數,不但穩定速度快,還能假冒瀏覽器欺騙目標地址哦!
方法1: 用file_get_contents 以get方式獲取內容
<?php
$url='http://www.domain.com/';
$html = file_get_contents($url);
echo $html;
?>
方法2: 用fopen打開url, 以get方式獲取內容
<?php
$fp = fopen($url, 'r');
stream_get_meta_data($fp);
while(!feof($fp)) {
$result .= fgets($fp, 1024);
}
echo "url body: $result";
fclose($fp);
?>
方法3:用file_get_contents函數,以post方式獲取url
<?php
$data = array ('foo' => 'bar');
$data = http_build_query($data);
$opts = array (
'http' => array (
'method' => 'POST',
'header'=> "Content-type: application/x-www-form-urlencodedrn" .
"Content-Length: " . strlen($data) . "rn",
'content' => $data
)
);
$context = stream_context_create($opts);
$html = file_get_contents('http://localhost/e/admin/test.html', false, $context);
echo $html;
?>
方法4:用fsockopen函數打開url,以get方式獲取完整的數據,包括header和body
<?php
function get_url ($url,$cookie=false)
{
$url = parse_url($url);
$query = $url[path]."?".$url[query];
echo "Query:".$query;
$fp = fsockopen( $url[host], $url[port]?$url[port]:80 , $errno, $errstr, 30);
if (!$fp) {
return false;
} else {
$request = "GET $query HTTP/1.1rn";
$request .= "Host: $url[host]rn";
$request .= "Connection: Closern";
if($cookie) $request.="Cookie: $cookien";
$request.="rn";
fwrite($fp,$request);
while()) {
$result .= @fgets($fp, 1024);
}
fclose($fp);
return $result;
}
}
//獲取url的html部分,去掉header
function GetUrlHTML($url,$cookie=false)
{
$rowdata = get_url($url,$cookie);
if($rowdata)
{
$body= stristr($rowdata,"rnrn");
$body=substr($body,4,strlen($body));
return $body;
}
return false;
}
?>
方法5:用fsockopen函數打開url,以POST方式獲取完整的數據,包括header和body
<?php
function HTTP_Post($URL,$data,$cookie, $referrer="")
{
// parsing the given URL
$URL_Info=parse_url($URL);
// Building referrer
if($referrer=="") // if not given use this script as referrer
$referrer="111″;
// making string from $data
foreach($data as $key=>$value)
$values[]="$key=".urlencode($value);
$data_string=implode("&",$values);
// Find out which port is needed – if not given use standard (=80)
if(!isset($URL_Info["port"]))
$URL_Info["port"]=80;
// building POST-request:
$request.="POST ".$URL_Info["path"]." HTTP/1.1n";
$request.="Host: ".$URL_Info["host"]."n";
$request.="Referer: $referern";
$request.="Content-type: application/x-www-form-urlencodedn";
$request.="Content-length: ".strlen($data_string)."n";
$request.="Connection: closen";
$request.="Cookie: $cookien";
$request.="n";
$request.=$data_string."n";
$fp = fsockopen($URL_Info["host"],$URL_Info["port"]);
fputs($fp, $request);
while(!feof($fp)) {
$result .= fgets($fp, 1024);
}
fclose($fp);
return $result;
}
?>
方法6:使用curl庫,使用curl庫之前,可能需要查看一下php.ini是否已經打開了curl擴展
<?php
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, 'http://www.domain.com/');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
echo $file_contents;
?>
php中 curl, fsockopen ,file_get_contents 三個函數 都可以實現采集模擬發言 。三者有什么區別,或者講究么
趙永斌:
有些時候用file_get_contents()調用外部文件,容易超時報錯。換成curl后就可以.具體原因不清楚
curl 效率比file_get_contents()和fsockopen()高一些,原因是CURL會自動對DNS信息進行緩存(亮點啊有我待親測)
范佳鵬:
file_get_contents curl fsockopen
在當前所請求環境下選擇性操作,沒有一概而論:
具我們公司開發KBI應用來看:
剛開始采用:file_get_contents
后來采用:fsockopen
最后到至今采用:curl
(遠程)我個人理解到的表述如下(不對請指出,不到位請補充)
file_get_contents 需要php.ini里開啟allow_url_fopen,請求http時,使用的是http_fopen_wrapper,不會keeplive.curl是可以的。
file_get_contents()單個執行效率高,返回沒有頭的信息。
這個是讀取一般文件的時候并沒有什么問題,但是在讀取遠程問題的時候就會出現問題。
如果是要打一個持續連接,多次請求多個頁面。那么file_get_contents和fopen就會出問題。
取得的內容也可能會不對。所以做一些類似采集工作的時候,肯定就有問題了。
sock較底層,配置麻煩,不易操作。 返回完整信息。
潘少寧-騰訊:
file_get_contents 雖然可以獲得某URL的內容,但不能post get啊。
curl 則可以post和get啊。還可以獲得head信息
而socket則更底層。可以設置基于UDP或是TCP協議去交互
file_get_contents 和 curl 能干的,socket都能干。
socket能干的,curl 就不一定能干了
file_get_contents 更多的時候 只是去拉取數據。效率比較高 也比較簡單。
趙的情況這個我也遇到過,我通過CURL設置host 就OK了。 這和網絡環境有關系
<?php
/**
* Socket版本
* 使用方法:
* $post_string = "app=socket&version=beta";
* request_by_socket('jb51.net','/restServer.php',$post_string);
*/
function request_by_socket($remote_server,$remote_path,$post_string,$port = 80,$timeout = 30){
$socket = fsockopen($remote_server,$port,$errno,$errstr,$timeout);
if (!$socket) die("$errstr($errno)");
fwrite($socket,"POST $remote_path HTTP/1.0");
fwrite($socket,"User-Agent: Socket Example");
fwrite($socket,"HOST: $remote_server");
fwrite($socket,"Content-type: application/x-www-form-urlencoded");
fwrite($socket,"Content-length: ".strlen($post_string)+8."");
fwrite($socket,"Accept:*/*");
fwrite($socket,"");
fwrite($socket,"mypost=$post_string");
fwrite($socket,"");
$header = "";
while ($str = trim(fgets($socket,4096))) {
$header.=$str;
}
$data = "";
while (!feof($socket)) {
$data .= fgets($socket,4096);
}
return $data;
}
/**
* Curl版本
* 使用方法:
* $post_string = "app=request&version=beta";
* request_by_curl('http://jb51.net/restServer.php',$post_string);
*/
function request_by_curl($remote_server,$post_string){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$remote_server);
curl_setopt($ch,CURLOPT_POSTFIELDS,'mypost='.$post_string);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_USERAGENT,"Jimmy's CURL Example beta");
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
/**
* 其它版本
* 使用方法:
* $post_string = "app=request&version=beta";
* request_by_other('http://jb51.net/restServer.php',$post_string);
*/
function request_by_other($remote_server,$post_string){
$context = array(
'http'=>array(
'method'=>'POST',
'header'=>'Content-type: application/x-www-form-urlencoded'."".
'User-Agent : Jimmy's POST Example beta'."".
'Content-length: '.strlen($post_string)+8,
'content'=>'mypost='.$post_string)
);
$stream_context = stream_context_create($context);
$data = file_get_contents($remote_server,FALSE,$stream_context);
return $data;
}
?>
/**
* 發送post請求
* @param string $url 請求地址
* @param array $post_data post鍵值對數據
* @return string
*/
function send_post($url, $post_data) {
$postdata = http_build_query($post_data);
$options = array(
'http' =>; array(
'method' =>; 'POST',
'header' =>; 'Content-type:application/x-www-form-urlencoded',
'content' =>; $postdata,
'timeout' =>; 15 * 60 // 超時時間(單位:s)
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
return $result;
}
使用如下:
post_data = array(
'username' => 'stclair2201',
'password' => 'handan'
);
send_post('http://blog.snsgou.com', $post_data);
實戰經驗:
當我利用上述代碼給另一臺服務器發送http請求時,發現,如果服務器處理請求時間過長,本地的PHP會中斷請求,即所謂的超時中斷,第一個懷疑的是PHP本身執行時間的超過限制,但想想也不應該,因為老早就按照這篇文章設置了“PHP執行時間限制”(【推薦】PHP上傳文件大小限制大全 ),仔細琢磨,想想,應該是http請求本身的一個時間限制,于是乎,就想到了怎么給http請求時間限制搞大一點。。。。。。查看PHP手冊,果真有個參數 “ timeout ”,默認不知道多大,當把它的值設大一點,問題得已解決
Socket版本:
/**
* Socket版本
* 使用方法:
* $post_string = "app=socket&version=beta";
* request_by_socket('blog.snsgou.com', '/restServer.php', $post_string);
*/
function request_by_socket($remote_server,$remote_path,$post_string,$port = 80,$timeout = 30) {
$socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout);
if (!$socket) die("$errstr($errno)");
fwrite($socket, "POST $remote_path HTTP/1.0");
fwrite($socket, "User-Agent: Socket Example");
fwrite($socket, "HOST: $remote_server");
fwrite($socket, "Content-type: application/x-www-form-urlencoded");
fwrite($socket, "Content-length: " . (strlen($post_string) + 8) . "");
fwrite($socket, "Accept:*/*");
fwrite($socket, "");
fwrite($socket, "mypost=$post_string");
fwrite($socket, "");
$header = "";
while ($str = trim(fgets($socket, 4096))) {
$header .= $str;
}
$data = "";
while (!feof($socket)) {
$data .= fgets($socket, 4096);
}
return $data;
}
Curl版本:
/**
* Curl版本
* 使用方法:
* $post_string = "app=request&version=beta";
* request_by_curl('http://blog.snsgou.com/restServer.php', $post_string);
*/
function request_by_curl($remote_server, $post_string) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $remote_server);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'mypost=' . $post_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "snsgou.com's CURL Example beta");
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
Curl版本(2)
/**
* 發送HTTP請求
*
* @param string $url 請求地址
* @param string $method 請求方式 GET/POST
* @param string $refererUrl 請求來源地址
* @param array $data 發送數據
* @param string $contentType
* @param string $timeout
* @param string $proxy
* @return boolean
*/
function send_request($url, $data, $refererUrl = '', $method = 'GET', $contentType = 'application/json', $timeout = 30, $proxy = false) {
$ch = null;
if('POST' === strtoupper($method)) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER,0 );
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
if ($refererUrl) {
curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
}
if($contentType) {
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:'.$contentType));
}
if(is_string($data)){
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
} else {
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
}
} else if('GET' === strtoupper($method)) {
if(is_string($data)) {
$real_url = $url. (strpos($url, '?') === false ? '?' : ''). $data;
} else {
$real_url = $url. (strpos($url, '?') === false ? '?' : ''). http_build_query($data);
}
$ch = curl_init($real_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:'.$contentType));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
if ($refererUrl) {
curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
}
} else {
$args = func_get_args();
return false;
}
if($proxy) {
curl_setopt($ch, CURLOPT_PROXY, $proxy);
}
$ret = curl_exec($ch);
$info = curl_getinfo($ch);
$contents = array(
'httpInfo' => array(
'send' => $data,
'url' => $url,
'ret' => $ret,
'http' => $info,
)
);
curl_close($ch);
return $ret;
}
調用 WCF接口 的一個例子:$json = restRequest($r_url,'POST', json_encode($data));
實際上magento模版默認就是接入了paypal的,用戶只需要到magento的后臺,對Paypal帳戶進行設置即可。
如何在magento后臺設置paypal呢? 這邊我簡單跟大家分享一下。
1、System -> Configuration -> Paypal
如果沒看到Paypal,則在

2:
OFOL_DE.jpg)
OFOL_DE.jpg)

3:

后臺設定好了,保存,然后刷新緩存,就可以支付了。
注意可能會出現的問題:(測試的時候很容易出現的問題)
因為測試的時候大家一般隨便寫地址,所以測試的時候會出現錯誤:無法處理付款。由于商家提供的送貨地址無效,而且商家要求您的訂單必須送到該地址,因此,請與該商家進行聯系。
解決方法:找到Paypal/Mode/Standard.php,里面有’address_override’ =1,這一行改成’address_override’=0,就可以了,大致在158行。
設置二、app/code/core/mage/paypal/model/api/standard.php 237行
$request['address_override'] = 1;將這個值設置為0 ,填寫假的地址也可以跳轉過去了!
摘要: 1 J2me開發網 http://www.j2medev.com/bbs/index.asp2 J2me社區 http://www.j2meforums.com/forum/3 csdn http://www.csdn.net/4 Vc知識庫 http://www.vckbase.com/5 codeproject http://www.codep...
閱讀全文