導航:首頁 > 編程語言 > phpsocket的作用

phpsocket的作用

發布時間:2022-06-30 20:07:11

php的curl和socket的區別

首先說下啥是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] view plain
<?php
//初始化curl
$ch = curl_init ();
/*
* 設置curl
* php手冊對於curl_setopt的解釋為:設置對於curl傳輸的操作
* curl_setopt有三個參數:資源(一般為你建立的curl句柄)、操作(你將對這個句柄作何操作)、參數(對於這個操作你給出的參數)
*/
//例如你想對網路進行某些操作
curl_setopt ( $ch, CURLOPT_URL, "http://www..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 plain
<?php
//初始化curl
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, "http://www..com");
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_exec($ch);
$info = curl_getinfo($ch);
var_mp($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」//重定向耗時

② php的curl socket soap 這幾個擴展有什麼作用和區別

curl 一般是為了提交頁面的.如get.post.上傳,下載等功能 .
socket 也有上面那些功能.一般很少用.可以做socket應用.如聊天室.可以做網路應用.
php socket這個功能不強.
soap 做webservice 這種協議很多語言都支持.跨平台性非常強. 很好用.一般介面用他比較多.
另外介面還有很多種如rest.xmlrpc等等

③ PHP SOCKET 技術研究

今天試著寫一個
PHP

C
語言通過socket通訊的程序,看過PHP手冊,發現有好幾種方式可以建立socket
客戶端.
1、通過
fsockopen()
建立socket連接,然後用
用fputs()
發送消息,用
fgets()
接收消息。
2、通過
socket_create()
建立
socket
連接,然後用
socket_send()
or
socket_write()
發送消息,用
socket_recv()
or
socket_read()
發送消息。

很奇怪,我在手冊上看到了這樣一段話"本擴展模塊是實驗性的。該模塊的行為,包括其函數的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨
PHP
以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。"
看來
php4.0
socket通訊還不是完全穩定。
今天我寫的客戶端要與服務端做兩次通訊,我用上面這個方法都寫了一個客戶端程序,發現當僅僅就一次通訊的時候,也就是PHP客戶端發送一次消息,然後接收返回消息,就關閉連接。這兩種方法都能正確快速的實現功能,但當做兩次通訊時,卻有明顯的差別,第一種方法第一次通訊特別快就結束了,這個我可以通過服務端的輸出看出來,但是第二次通訊要等上好幾分鍾才能結束,我試了好幾次都這樣,我不太清楚我的程序哪裡出錯了,還是這個方式連接就是有問題,但是第二種方法做這兩次通訊卻很快,正確!完成的非常的。
最後我根據
第二種情況寫了一個
class
//////////////////////////////
File
Description
//////////////////////////////////////////
//
Class
Name
:
socket
//
Version
:
V1.0
//
Functional
Outline
:
create
socket,and
send
message
to
server
//
Revision
history
:
2004/12/15
First
version
created
//
Current
:
2004/12/15
Liu
Yongsheng
//////////////////////////////////////////////////////////////////////////////////////////
class
socket{
var
$socket;
//socket
句柄
var
$sendflag
=
">>>";
var
$recvflag
=
"<<<";
var
$response;
var
$debug
=
1;
function
socket($hostname,$port){

$address
=
gethostbyname($hostname);

$this->socket
=
socket_create(AF_INET,SOCK_STREAM,SOL_TCP);

$result
=
socket_connect($this->socket,$address,$port);

if($this->debug
==
1){

if
($result
<
0)
{

echo
"socket_connect()
failed.\nReason:
($result)
"
.
socket_strerror($result)
.
"<br>";

}
else{

echo
"connect
OK.<br>";

}

}
}
function
sendmsg($msg){

socket_write($this->socket,$msg,strlen($msg));

$result
=
socket_read($this->socket,100);

$this->response
=
$result;

if($this->debug
==
1){

printf("<font
color=#CCCCCC>%s
$msg</fon><br>",$this->sendflag);

printf("<font
color=blue>%s
$result</font><br>",$this->recvflag);

}

return
$result;
}
function
close(){

socket_close($this->socket);
}
}

④ PHP編程語言中的socket是什麼東西

HP使用Berkley的socket庫來創建它的連接。你可以知道socket只不過是一個數據結構。你使用這個socket數據結構去開始一個客戶端和伺服器之間的會話。這個伺服器是一直在監聽准備產生一個新的會話。當一個客戶端連接伺服器,它就打開伺服器正在進行監聽的一個埠進行會話。這時,伺服器端接受客戶端的連接請求,那麼就進行一次循環。現在這個客戶端就能夠發送信息到伺服器,伺服器也能發送信息給客戶端。產生一個Socket,你需要三個變數:一個協議、一個socket類型和一個公共協議類型。產生一個socket有三種協議供選擇,繼續看下面的內容來獲取詳細的協議內容。定義一個公共的協議類型是進行連接一個必不可少的元素。下面的表我們看看有那些公共的協議類型。表一:協議名字/常量描述AF_INET這是大多數用來產生socket的協議,使用TCP或UDP來傳輸,用在IPv4的地址AF_INET6與上面類似,不過是來用在IPv6的地址AF_UNIX本地協議,使用在Unix和Linux系統上,它很少使用,一般都是當客戶端和伺服器在同一台及其上的時候使用表二:Socket類型名字/常量描述SOCK_STREAM這個協議是按照順序的、可靠的、數據完整的基於位元組流的連接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。SOCK_DGRAM這個協議是無連接的、固定長度的傳輸調用。該協議是不可靠的,使用UDP來進行它的連接。SOCK_SEQPACKET這個協議是雙線路的、可靠的連接,發送固定長度的數據包進行傳輸。必須把這個包完整的接受才能進行讀取。SOCK_RAW這個socket類型提供單一的網路訪問,這個socket類型使用ICMP公共協議。(ping、traceroute使用該協議)SOCK_RDM這個類型是很少使用的,在大部分的操作系統上沒有實現,它是提供給數據鏈路層使用,不保證數據包的順序表三:公共協議名字/常量描述ICMP互聯網控制消息協議,主要使用在網關和主機上,用來檢查網路狀況和報告錯誤信息UDP用戶數據報文協議,它是一個無連接,不可靠的傳輸協議TCP傳輸控制協議,這是一個使用最多的可靠的公共協議,它能保證數據包能夠到達接受者那兒,如果在傳輸過程中發生錯誤,那麼它將重新發送出錯數據包。現在你知道了產生一個socket的三個元素,那麼我們就在php中使用socket_create()函數來產生一個socket。這個socket_create()函數需要三個參數:一個協議、一個socket類型、一個公共協議。socket_create()函數運行成功返回一個包含socket的資源類型,如果沒有成功則返回false。Resourecesocket_create(intprotocol,intsocketType,intcommonProtocol);現在你產生一個socket,然後呢?php提供了幾個操縱socket的函數。你能夠綁定socket到一個IP,監聽一個socket的通信,接受一個socket;現在我們來看一個例子,了解函數是如何產生、接受和監聽一個socket。上面這個例子產生一個你自己的伺服器端。例子第一行,$commonProtocol=getprotobyname(「tcp」);使用公共協議名字來獲取一個協議類型。在這里使用的是TCP公共協議,如果你想使用UDP或者ICMP協議,那麼你應該把getprotobyname()函數的參數改為「udp」或「icmp」。還有一個可選的法是不使用getprotobyname()函數而是指定SOL_TCP或SOL_UDP在socket_create()函數中。$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);例子的第二行是產生一個socket並且返回一個socket資源的實例。在你有了一個socket資源的實例以後,你就必須把socket綁定到一個IP地址和某一個埠上。socket_bind($socket,『localhost』,1337);在這里你綁定socket到本地計算機(127.0.0.1)和綁定socket到你的1337埠。然後你就需要監聽所有進來的socket連接。socket_listen($socket);在第四行以後,你就需要了解所有的socket函數和他們的使用。表四:Socket函數函數名描述socket_accept()接受一個Socket連接socket_bind()把socket綁定在一個IP地址和埠上socket_clear_error()清除socket的錯誤或者最後的錯誤代碼socket_close()關閉一個socket資源socket_connect()開始一個socket連接socket_create_listen()在指定埠打開一個socket監聽socket_create_pair()產生一對沒有區別的socket到一個數組里socket_create()產生一個socket,相當於產生一個socket的數據結構socket_get_option()獲取socket選項socket_getpeername()獲取遠程類似主機的ip地址socket_getsockname()獲取本地socket的ip地址socket_iovec_add()添加一個新的向量到一個分散/聚合的數組socket_iovec_alloc()這個函數創建一個能夠發送接收讀寫的iovec數據結構socket_iovec_delete()刪除一個已經分配的iovecsocket_iovec_fetch()返回指定的iovec資源的數據socket_iovec_free()釋放一個iovec資源socket_iovec_set()設置iovec的數據新值socket_last_error()獲取當前socket的最後錯誤代碼socket_listen()監聽由指定socket的所有連接socket_read()讀取指定長度的數據socket_readv()讀取從分散/聚合數組過來的數據socket_recv()從socket里結束數據到緩存socket_recvfrom()接受數據從指定的socket,如果沒有指定則默認當前socketsocket_recvmsg()從iovec里接受消息socket_select()多路選擇socket_send()這個函數發送數據到已連接的socketsocket_sendmsg()發送消息到socketsocket_sendto()發送消息到指定地址的socketsocket_set_block()在socket里設置為塊模式socket_set_nonblock()socket里設置為非塊模式socket_set_option()設置socket選項socket_shutdown()這個函數允許你關閉讀、寫、或者指定的socketsocket_strerror()返回指定錯誤號的詳細錯誤socket_write()寫數據到socket緩存socket_writev()寫數據到分散/聚合數組(注:函數介紹刪減了部分原文內容,函數詳細使用建議參考英文原文,或者參考PHP手冊)以上所有的函數都是PHP中關於socket的,使用這些函數,你必須把你的socket打開,如果你沒有打開,請編輯你的php.ini文件,去掉下面這行前面的注釋:extension=php_sockets.dll如果你無法去掉注釋,那麼請使用下面的代碼來載入擴展庫:如果你不知道你的socket是否打開,那麼你可以使用phpinfo()函數來確定socket是否打開。你通過查看phpinfo信息了解socket是否打開。如下圖:查看phpinfo()關於socket的信息◆產生一個伺服器現在我們把第一個例子進行完善。你需要監聽一個指定的socket並且處理用戶的連接。你應該使用你的命令提示符來運行這個例子。理由是因為這里將產生一個伺服器,而不是一個Web頁面。如果你嘗試使用Web瀏覽器來運行這個腳本,那麼很有可能它會超過30秒的限時。你可以使用下面的代碼來設置一個無限的運行時間,但是還是建議使用命令提示符來運行。set_time_limit(0);在你的命令提示符中對這個腳本進行簡單測試:Php.exeexample01_server.php如果你沒有在系統的環境變數中設置php解釋器的路徑,那麼你將需要給php.exe指定詳細的路徑。當你運行這個伺服器端的時候,你能夠通過遠程登陸(telnet)的方式連接到埠1337來測試這個伺服器。如下圖:上面的伺服器端有三個問題:1.它不能接受多個連接。2.它只完成唯一的一個命令。3.你不能通過Web瀏覽器連接這個伺服器。這個第一個問題比較容易解決,你可以使用一個應用程序去每次都連接到伺服器。但是後面的問題是你需要使用一個Web頁面去連接這個伺服器,這個比較困難。你可以讓你的伺服器接受連接,然後些數據到客戶端(如果它一定要寫的話),關閉連接並且等待下一個連接。在上一個代碼的基礎上再改進,產生下面的代碼來做你的新伺服器端:這個伺服器端要做什麼呢?它初始化一個socket並且打開一個緩存收發數據。它等待連接,一旦產生一個連接,它將列印「Socketconnected」在伺服器端的屏幕上。這個伺服器檢查緩沖區,如果緩沖區里有數據,它將把數據發送到連接過來的計算機。然後它發送這個數據的接受信息,一旦它接受了信息,就把信息保存到數據里,並且讓連接的計算機知道這些信息,最後關閉連接。當連接關閉後,伺服器又開始處理下一次連接。(翻譯的爛,附上原文)Thisiswhattheserverdoes..Thenitwaitsforaconnection.「Socketconnected」.;ifthereis,..,,andthenclosestheconnection.Aftertheconnectionisclosed,.◆產生一個客戶端處理第二個問題是很容易的。你需要產生一個php頁連接一個socket,發送一些數據進它的緩存並處理它。然後你又個處理後的數據在還頓,你能夠發送你的數據到伺服器。在另外一台客戶端連接,它將處理那些數據。.,,andprocessit..Whenanotherclientconnects,.下面的例子示範了使用socket:這個例子的代碼演示了客戶端連接到伺服器。客戶端讀取數據。如果這是第一時間到達這個循環的首次連接,這個伺服器將發送「NODATA」返回給客戶端。如果情況發生了,這個客戶端在連接之上。客戶端發送它的數據到伺服器,數據發送給伺服器,客戶端等待響應。一旦接受到響應,那麼它將把響應寫到屏幕上。

⑤ php socket可以做什麼

PHP 使用Berkley的socket庫來創建它的連接。你可以知道socket只不過是一個數據結構。你使用這個socket數據結構去開始一個客戶端和伺服器之間的會話。這個伺服器是一直在監聽准備產生一個新的會話。當一個客戶端連接伺服器,它就打開伺服器正在進行監聽的一個埠進行會話。這時,伺服器端接受客戶端的連接請求,那麼就進行一次循環。現在這個客戶端就能夠發送信息到伺服器,伺服器也能發送信息給客戶端。
產生一個Socket,你需要三個變數:一個協議、一個socket類型和一個公共協議類型。產生一個socket有三種協議供選擇,繼續看下面的內容來獲取詳細的協議內容。
定義一個公共的協議類型是進行連接一個必不可少的元素。下面的表我們看看有那些公共的協議類型。

表一:協議
名字/常量 描述
AF_INET 這是大多數用來產生socket的協議,使用TCP或UDP來傳輸,用在IPv4的地址
AF_INET6 與上面類似,不過是來用在IPv6的地址
AF_UNIX 本地協議,使用在Unix和Linux系統上,它很少使用,一般都是當客戶端和伺服器在同一台及其上的時候使用
表二:Socket類型
名字/常量 描述
SOCK_STREAM 這個協議是按照順序的、可靠的、數據完整的基於位元組流的連接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。
SOCK_DGRAM 這個協議是無連接的、固定長度的傳輸調用。該協議是不可靠的,使用UDP來進行它的連接。
SOCK_SEQPACKET 這個協議是雙線路的、可靠的連接,發送固定長度的數據包進行傳輸。必須把這個包完整的接受才能進行讀取。
SOCK_RAW 這個socket類型提供單一的網路訪問,這個socket類型使用ICMP公共協議。(ping、traceroute使用該協議)
SOCK_RDM 這個類型是很少使用的,在大部分的操作系統上沒有實現,它是提供給數據鏈路層使用,不保證數據包的順序

表三:公共協議
名字/常量 描述
ICMP 互聯網控制消息協議,主要使用在網關和主機上,用來檢查網路狀況和報告錯誤信息
UDP 用戶數據報文協議,它是一個無連接,不可靠的傳輸協議
TCP 傳輸控制協議,這是一個使用最多的可靠的公共協議,它能保證數據包能夠到達接受者那兒,如果在傳輸過程中發生錯誤,那麼它將重新發送出錯數據包。

現在你知道了產生一個socket的三個元素,那麼我們就在php中使用socket_create()函數來產生一個socket。這個 socket_create()函數需要三個參數:一個協議、一個socket類型、一個公共協議。socket_create()函數運行成功返回一個包含socket的資源類型,如果沒有成功則返回false。
Resourece socket_create(int protocol, int socketType, int commonProtocol);

現在你產生一個socket,然後呢?php提供了幾個操縱socket的函數。你能夠綁定socket到一個IP,監聽一個socket的通信,接受一個socket;現在我們來看一個例子,了解函數是如何產生、接受和監聽一個socket。

<?php
$commonProtocol = getprotobyname(「tcp」);
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 『localhost』, 1337);
socket_listen($socket);
// More socket functionality to come
?>

上面這個例子產生一個你自己的伺服器端。例子第一行,
$commonProtocol = getprotobyname(「tcp」);
使用公共協議名字來獲取一個協議類型。在這里使用的是TCP公共協議,如果你想使用UDP或者ICMP協議,那麼你應該把getprotobyname() 函數的參數改為「udp」或「icmp」。還有一個可選的辦法是不使用getprotobyname()函數而是指定SOL_TCP或SOL_UDP在 socket_create()函數中。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
例子的第二行是產生一個socket並且返回一個socket資源的實例。在你有了一個socket資源的實例以後,你就必須把socket綁定到一個IP地址和某一個埠上。
socket_bind($socket, 『localhost』, 1337);
在這里你綁定socket到本地計算機(127.0.0.1)和綁定socket到你的1337埠。然後你就需要監聽所有進來的socket連接。
socket_listen($socket);
在第四行以後,你就需要了解所有的socket函數和他們的使用。

表四:Socket函數
函數名 描述
socket_accept() 接受一個Socket連接
socket_bind() 把socket綁定在一個IP地址和埠上
socket_clear_error() 清除socket的錯誤或者最後的錯誤代碼
socket_close() 關閉一個socket資源
socket_connect() 開始一個socket連接
socket_create_listen() 在指定埠打開一個socket監聽
socket_create_pair() 產生一對沒有區別的socket到一個數組里
socket_create() 產生一個socket,相當於產生一個socket的數據結構
socket_get_option() 獲取socket選項
socket_getpeername() 獲取遠程類似主機的ip地址
socket_getsockname() 獲取本地socket的ip地址
socket_iovec_add() 添加一個新的向量到一個分散/聚合的數組
socket_iovec_alloc() 這個函數創建一個能夠發送接收讀寫的iovec數據結構
socket_iovec_delete() 刪除一個已經分配的iovec
socket_iovec_fetch() 返回指定的iovec資源的數據
socket_iovec_free() 釋放一個iovec資源
socket_iovec_set() 設置iovec的數據新值
socket_last_error() 獲取當前socket的最後錯誤代碼
socket_listen() 監聽由指定socket的所有連接
socket_read() 讀取指定長度的數據
socket_readv() 讀取從分散/聚合數組過來的數據
socket_recv() 從socket里結束數據到緩存
socket_recvfrom() 接受數據從指定的socket,如果沒有指定則默認當前socket
socket_recvmsg() 從iovec里接受消息
socket_select() 多路選擇
socket_send() 這個函數發送數據到已連接的socket
socket_sendmsg() 發送消息到socket
socket_sendto() 發送消息到指定地址的socket
socket_set_block() 在socket里設置為塊模式
socket_set_nonblock() socket里設置為非塊模式
socket_set_option() 設置socket選項
socket_shutdown() 這個函數允許你關閉讀、寫、或者指定的socket
socket_strerror() 返回指定錯誤號的詳細錯誤
socket_write() 寫數據到socket緩存
socket_writev() 寫數據到分散/聚合數組

(注: 函數介紹刪減了部分原文內容,函數詳細使用建議參考英文原文,或者參考PHP手冊)

以上所有的函數都是PHP中關於socket的,使用這些函數,你必須把你的socket打開,如果你沒有打開,請編輯你的php.ini文件,去掉下面這行前面的注釋:
extension=php_sockets.dll
如果你無法去掉注釋,那麼請使用下面的代碼來載入擴展庫:
<?php
if(!extension_loaded(『sockets』))
{
if(strtoupper(substr(PHP_OS, 3)) == 「WIN」)
{
dl(『php_sockets.dll』);
}
else
{
dl(『sockets.so』);
}
}
?>

如果你不知道你的socket是否打開,那麼你可以使用phpinfo()函數來確定socket是否打開。你通過查看phpinfo信息了解socket是否打開。如下圖:

查看phpinfo()關於socket的信息

◆產生一個伺服器

現在我們把第一個例子進行完善。你需要監聽一個指定的socket並且處理用戶的連接。

<?php
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337);
socket_listen($socket);
// Accept any incoming connections to the server
$connection = socket_accept($socket);
if($connection)
{
socket_write($connection, "You have connected to the socket.../n/r");
}
?>

你應該使用你的命令提示符來運行這個例子。理由是因為這里將產生一個伺服器,而不是一個Web頁面。如果你嘗試使用Web瀏覽器來運行這個腳本,那麼很有可能它會超過30秒的限時。你可以使用下面的代碼來設置一個無限的運行時間,但是還是建議使用命令提示符來運行。
set_time_limit(0);
在你的命令提示符中對這個腳本進行簡單測試:
Php.exe example01_server.php
如果你沒有在系統的環境變數中設置php解釋器的路徑,那麼你將需要給php.exe指定詳細的路徑。當你運行這個伺服器端的時候,你能夠通過遠程登陸(telnet)的方式連接到埠1337來測試這個伺服器。如下圖:

上面的伺服器端有三個問題:1. 它不能接受多個連接。2. 它只完成唯一的一個命令。3. 你不能通過Web瀏覽器連接這個伺服器。
這個第一個問題比較容易解決,你可以使用一個應用程序去每次都連接到伺服器。但是後面的問題是你需要使用一個Web頁面去連接這個伺服器,這個比較困難。你可以讓你的伺服器接受連接,然後些數據到客戶端(如果它一定要寫的話),關閉連接並且等待下一個連接。
在上一個代碼的基礎上再改進,產生下面的代碼來做你的新伺服器端:

<?php
// Set up our socket
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337);
socket_listen($socket);
// Initialize the buffer
$buffer = "NO DATA";
while(true)
{
// Accept any connections coming in on this socket

$connection = socket_accept($socket);
printf("Socket connected/r/n");
// Check to see if there is anything in the buffer
if($buffer != "")
{
printf("Something is in the buffer...sending data.../r/n");
socket_write($connection, $buffer . "/r/n");
printf("Wrote to socket/r/n");
}
else
{
printf("No Data in the buffer/r/n");
}
// Get the input
while($data = socket_read($connection, 1024, PHP_NORMAL_READ))
{
$buffer = $data;
socket_write($connection, "Information Received/r/n");
printf("Buffer: " . $buffer . "/r/n");
}
socket_close($connection);
printf("Closed the socket/r/n/r/n");
}
?>

這個伺服器端要做什麼呢?它初始化一個socket並且打開一個緩存收發數據。它等待連接,一旦產生一個連接,它將列印「Socket connected」在伺服器端的屏幕上。這個伺服器檢查緩沖區,如果緩沖區里有數據,它將把數據發送到連接過來的計算機。然後它發送這個數據的接受信息,一旦它接受了信息,就把信息保存到數據里,並且讓連接的計算機知道這些信息,最後關閉連接。當連接關閉後,伺服器又開始處理下一次連接。(翻譯的爛,附上原文)
This is what the server does. It initializes the socket and the buffer that you use to receive
and send data. Then it waits for a connection. Once a connection is created it prints
「Socket connected」 to the screen the server is running on. The server then checks to see if
there is anything in the buffer; if there is, it sends the data to the connected computer.
After it sends the data it waits to receive information. Once it receives information it stores
it in the data, lets the connected computer know that it has received the information, and
then closes the connection. After the connection is closed, the server starts the whole
process again.

◆產生一個客戶端

處理第二個問題是很容易的。你需要產生一個php頁連接一個socket,發送一些數據進它的緩存並處理它。然後你又個處理後的數據在還頓,你能夠發送你的數據到伺服器。在另外一台客戶端連接,它將處理那些數據。
To solve the second problem is very easy. You need to create a PHP page that connects to
a socket, receive any data that is in the buffer, and process it. After you have processed the
data in the buffer you can send your data to the server. When another client connects, it
will process the data you sent and the client will send more data back to the server.

下面的例子示範了使用socket:

<?php
// Create the socket and connect
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connection = socket_connect($socket,』localhost』, 1337);
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ))
{
if($buffer == 「NO DATA」)
{
echo(「<p>NO DATA</p>」);
break;
}
else
{
// Do something with the data in the buffer
echo(「<p>Buffer Data: 「 . $buffer . 「</p>」);
}
}
echo(「<p>Writing to Socket</p>」);
// Write some test data to our socket
if(!socket_write($socket, 「SOME DATA/r/n」))
{
echo(「<p>Write failed</p>」);
}
// Read any response from the socket
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ))
{
echo(「<p>Data sent was: SOME DATA<br> Response was:」 . $buffer . 「</p>」);
}
echo(「<p>Done Reading from Socket</p>」);
?>

這個例子的代碼演示了客戶端連接到伺服器。客戶端讀取數據。如果這是第一時間到達這個循環的首次連接,這個伺服器將發送「NO DATA」返回給客戶端。如果情況發生了,這個客戶端在連接之上。客戶端發送它的數據到伺服器,數據發送給伺服器,客戶端等待響應。一旦接受到響應,那麼它將把響應寫到屏幕上。

⑥ 什麼是socketPHP如何實現socket通信

網路上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。
建立網路通信連接至少要一對埠號(socket)。socket本質是編程介面(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網路開發所用的介面,這就是Socket編程介面;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網路通信的能力。
PHP在socket開發上不是很給力,可以考慮使用workerman~

⑦ 關於socket通信運行機制的問題(PHP):

php socket 是以php cli 模式運行的 也就是在伺服器上用命令行執行php xxx.php
而你要保持這個文件的長連接 。就是持久監控。
保持長連接也就是死循環
while(true){
這里寫socket的一些方法
}
這樣他就是會一直執行。設置超時時間為0
這就socket的基本而原理 也是消息隊列的基本原理

⑧ 關於php中socket的問題:

這是socket的服務端的代碼,監聽的ip地址是192.168.168.121,埠號為8528


請檢查以下幾點

  1. 這個ip是不是代碼所在伺服器的ip,一般監測內網ip,如127.0.0.1

  2. 埠號是否被使用,可以使用cmd命令 netstat -ano|findstr 8528 查找埠號為8528的埠使用情況

  3. 如果要給在公網上使用,請使用公網ip,這樣可以外網使用

  4. 如果代碼不報錯可以試下telnet下你的埠號,看是否可以使用

    如 telnet 127.0.0.1 8528

解決方案

查看你電腦的ip地址,把上面代碼里「$address = '192.168.168.121';」這個ip地址換成「$address = '127.0.0.1';」或者你電腦的ip地址,再試試。

(ip地址改成127.0.0.1後,這段代碼在我電腦上可以使用)

⑨ php中關於socket的系列函數總結

本文列舉了所有關於PHP語言中使用socket相關服務的一些函數。注意使用如下函數之前,你需要確保你的socket已打開,如果你沒有打開,請編輯你的php.ini文件,去掉下面這行前面的注釋(分號):

代碼如下:
extension=php_sockets.dll
如果你無法去掉注釋,那麼請使用下面的代碼來載入擴展庫:
代碼如下:

if(!extension_loaded('sockets')){
if(strtoupper(substr(PHP_OS,3))=="WIN"){
dl('php_sockets.dll');
}else{
dl('sockets.so');
}
}
如果你不知道你的socket是否打開,那麼你可以使用phpinfo()函數來確定socket是否打開。你通過查看phpinfo信息了解socket是否打開。
php
socket
相關函數如下:

代碼如下:
socket_accept()
接受一個Socket連接
socket_bind()
把socket綁定在一個IP地址和埠上
socket_clear_error()
清除socket的錯誤或者最後的錯誤代碼
socket_close()
關閉一個socket資源
socket_connect()
開始一個socket連接
socket_create_listen()
在指定埠打開一個socket監聽
socket_create_pair()
產生一對沒有區別的socket到一個數組里
socket_create()
產生一個socket,相當於產生一個socket的數據結構
socket_get_option()
獲取socket選項
socket_getpeername()
獲取遠程類似主機的ip地址
socket_getsockname()
獲取本地socket的ip地址
socket_iovec_add()
添加一個新的向量到一個分散/聚合的數組
socket_iovec_alloc()
這個函數創建一個能夠發送接收讀寫的iovec數據結構
socket_iovec_delete()
刪除一個已經分配的iovec
socket_iovec_fetch()
返回指定的iovec資源的數據
socket_iovec_free()
釋放一個iovec資源
socket_iovec_set()
設置iovec的數據新值
socket_last_error()
獲取當前socket的最後錯誤代碼
socket_listen()
監聽由指定socket的所有連接
socket_read()
讀取指定長度的數據
socket_readv()
讀取從分散/聚合數組過來的數據
socket_recv()
從socket里結束數據到緩存
socket_recvfrom()
接受數據從指定的socket,如果沒有指定則默認當前socket
socket_recvmsg()
從iovec里接受消息
socket_select()
多路選擇
socket_send()
這個函數發送數據到已連接的socket
socket_sendmsg()
發送消息到socket
socket_sendto()
發送消息到指定地址的socket
socket_set_block()
在socket里設置為塊模式
socket_set_nonblock()
socket里設置為非塊模式
socket_set_option()
設置socket選項
socket_shutdown()
這個函數允許你關閉讀、寫、或者指定的socket
socket_strerror()
返回指定錯誤號的詳細錯誤
socket_write()
寫數據到socket緩存
socket_writev()
寫數據到分散/聚合數組

閱讀全文

與phpsocket的作用相關的資料

熱點內容
華為伺服器如何進陣列卡配置 瀏覽:433
apache伺服器ip地址訪問 瀏覽:716
如何買到安卓手機預裝軟體 瀏覽:535
冤罪百度雲不要壓縮 瀏覽:83
蘇州雲存儲伺服器 瀏覽:173
解壓收納原聲 瀏覽:384
java注冊驗證 瀏覽:372
火花app怎麼上推薦 瀏覽:980
什麼app能游戲投屏到電視上 瀏覽:455
伺服器託管到雲端是什麼意思 瀏覽:835
app保存草稿怎麼用 瀏覽:808
安卓如何進入proumb 瀏覽:144
主機虛擬雲伺服器 瀏覽:619
刪除分區加密的空間會不會恢復 瀏覽:706
京東app客戶上門怎麼看搜索量 瀏覽:741
怎麼在農行app購買黃金 瀏覽:46
c型開發板和單片機 瀏覽:146
虛擬機建立用戶的模板文件夾 瀏覽:904
無錫代碼編程培訓班 瀏覽:632
eps圖形數據加密 瀏覽:933