2011-05-07 25 views
3

要有cURL支持,那麼php必須編譯--with-curl選項。
要支持套接字,則必須使用--enable-sockets選項編譯php。
要使流封裝支持http,ftp ...在fopen,file_get_contents等函數中...... allow_url_fopen必須在php.ini中設置爲On。

雖然大多數共享虛擬主機服務器都啓用了全部(或幾乎所有)以前的功能,但其中一些
可能不支持這些功能,因爲它們的可選狀態。

另一方面,流是php核心的一部分。
Php,大多數便攜式遠程服務器與核心流的連接?

$fp = stream_socket_client("tcp://example.com:80", $errno, $errstr); 
fwrite($fp, "GET/HTTP/1.0\r\nHost: example.com\r\nAccept: */*\r\n\r\n"); 

如果有人想使一個檸便攜式(我認爲),例如PHP HTTP客戶端,而不是基於捲曲, 插座,或包裝(HTTP)的支持,那麼,可以用做

使用不是http流包裝器,而是使用不同的流傳輸包裝器(tcp)。

我在我的localhost上看到,即使php.ini指令allow_url_fopen設置爲Off, 我可以通過stream_socket_client()使用tcp傳輸進行遠程連接。

我的問題是:
1.有沒有辦法來阻止核心流的可用性,除了禁用像stream_socket_client功能的可能性或通過硬編碼它們喜歡在php.ini的fsockopen:

disable_functions = exec,passthru,shell_exec,stream_socket_client,fsockopen ... 

? ?
2.使用$fp = stream_socket_client('tcp://...',[...]);最便攜的解決方案 進行遠程連接,通過先連接到正確的端口(例如80)和使用fwrite($fp, 'GET /...');發送低電平http/ftp查詢 到遠程服務器?

回答

3

主機公司想禁用遠程連接可能已經阻止了防火牆中的所有傳出連接,所以即使它們(錯誤地,我們可以假設)允許stream_socket_client,連接本身可能在傳輸層上被阻塞。

如果他們沒有在他們的防火牆阻止它,你仍然有兩個問題需要解決:

  • 他們可能會盡快爲他們瞭解它
  • 如果塊stream_socket_client他們不不知道如何(或照顧)爲他們的連接策略設置防火牆規則,他們可能不知道很多關於託管安全性的知識

您應該真的避免託管公司低你需要的功能。主機市場很大,有很多選擇,所以試圖找到一個適合您的需求。大多數主機已經允許傳出連接,並且不會阻塞套接字和URL流。 cURL內置於幾乎所有的PHP版本(以及幾乎所有的主機)。

回答您的問題:

  1. 是的,他們可能會阻止在防火牆傳出連接。即使那些允許url_fopen,cURL等常規阻止HTTP之外的大多數其他端口上的流量的主機也會使垃圾郵件發送者,破解者和其他黑客難以使用。

  2. 在服務器上下文中,也許。它不像cookies,重定向等那樣靈活。你仍然必須自己實現HTTP協議,這對於某些解決方案可能很容易(如果你的例子只需要一個沒有cookie等的常規GET),但是如果你想要支持cookie處理,重定向,錯誤處理可能會很麻煩,HTTPS,文件上傳等。

即使它可能是一個便攜的解決方案,我想你應該專注於其他事情比寫一個HTTP庫。找到一個支持cURL或類似的主機並不困難。

+0

+1,對錢。 – 2011-05-07 12:00:52