搜尋
首頁web前端js教程PHPSOCKET編程詳解

PHPSOCKET編程詳解

Mar 28, 2018 pm 03:10 PM
phpsocket程式設計

本文主要和大家分享PHP之SOCKET编程详解,主要结合文字和代码的形式和大家分享,希望能帮助到大家。

1. 预备知识

       一直以来很少看到有多少人使用php的socket模块来做一些事情,大概大家都把它定位在脚本语言的范畴内吧,但是其实php的socket模块可以做很多事情,包括做ftplist,http post提交,smtp提交,组包并进行特殊报文的交互(如smpp协议),whois查询。这些都是比较常见的查询。

特别是php的socket扩展库可以做的事情简直不会比c差多少。
php的socket连接函数
1、集成于内核的socket
这个系列的函数仅仅只能做主动连接无法实现端口监听相关的功能。而且在4.3.0之前所有socket连接只能工作在阻塞模式下。
此系列函数包括
fsockopen,pfsockopen
这两个函数的具体信息可以查询php.net的用户手册
他们均会返回一个资源编号对于这个资源可以使用几乎所有对文件操作的函数对其进行操作如fgets(),fwrite(), fclose()等单注意的是所有函数遵循这些函数面对网络信息流时的规律,例如:
fread() 从文件指针 handle 读取最多 length 个字节。 该函数在读取完 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时就会停止读取文件,视乎先碰到哪种情况。 
可以看出对于网络流就必须注意取到的是一个完整的包就停止。
2、php扩展模块带有的socket功能。
php4.x 以后有这么一个模块extension=php_sockets.dll,Linux上是一个extension=php_sockets.so。
当打开这个此模块以后就意味着php拥有了强大的socket功能,包括listen端口,阻塞及非阻塞模式的切换,multi-client 交互式处理等
这个系列的函数列表参看http://www.php.net/manual/en/ref.sockets.php
看过这个列表觉得是不是非常丰富呢?不过非常遗憾这个模块还非常年轻还有很多地方不成熟,相关的参考文档也非常少:(
我也正在研究中,因此暂时不具体讨论它,仅给大家一个参考文章。

2. 使用PHP socket扩展

服务器端代码:

<?php
/**
 * File name server.php
 * 服务器端代码
 * 
 * @author guisu.huang
 * @since 2012-04-11
 * 
 */

//确保在连接客户端时不会超时
set_time_limit(0);
//设置IP和端口号
$address = "127.0.0.1";
$port = 2046; //调试的时候,可以多换端口来测试程序!
/**
 * 创建一个SOCKET 
 * AF_INET=是ipv4 如果用ipv6,则参数为 AF_INET6
 * SOCK_STREAM为socket的tcp类型,如果是UDP则使用SOCK_DGRAM
*/
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
//阻塞模式
socket_set_block($sock) or die("socket_set_block() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
//绑定到socket端口
$result = socket_bind($sock, $address, $port) or die("socket_bind() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
//开始监听
$result = socket_listen($sock, 4) or die("socket_listen() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
echo "OK\nBinding the socket on $address:$port ... ";
echo "OK\nNow ready to accept connections.\nListening on the socket ... \n";
do { // never stop the daemon
	//它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息
	$msgsock = socket_accept($sock) or  die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n");
	
	//读取客户端数据
	echo "Read client data \n";
	//socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.
	$buf = socket_read($msgsock, 8192);
	echo "Received msg: $buf   \n";
	
	//数据传送 向客户端写入返回结果
	$msg = "welcome \n";
	socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n");
	//一旦输出被返回到客户端,父/子socket都应通过socket_close($msgsock)函数来终止
    socket_close($msgsock);
} while (true);
socket_close($sock);

客户端代码:

<?php
/**
 * File name:client.php
 * 客户端代码
 * 
 * @author guisu.huang
 * @since 2012-04-11
 */
set_time_limit(0);

$host = "127.0.0.1";
$port = 2046;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create	socket\n"); // 创建一个Socket
 
$connection = socket_connect($socket, $host, $port) or die("Could not connet server\n");    //  连接
socket_write($socket, "hello socket") or die("Write failed\n"); // 数据传送 向服务器发送消息
while ($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) {
    echo("Response was:" . $buff . "\n");
}
socket_close($socket);

使用cli方式启动server:

php server.php


这里注意socket_read函数:

可选的类型参数是一个命名的常数:
PHP_BINARY_READ - 使用系统recv()函数。用于读取二进制数据的安全。 (在PHP>“默认= 4.1.0)
PHP_NORMAL_READ - 读停在\ n或\r(在PHP 

針對參數PHP_NORMAL_READ ,如果伺服器的回應結果沒有\ n。造成socket_read(): unable to read from socket


3.PHP的並發IO程式設計

原文:http://rango .swoole.com/archives/508

1) 多進程/多執行緒同步阻塞

#最早的伺服器端程式都是透過多進程、多執行緒來解決並發IO的問題。進程模型出現的最早,從Unix系統誕生就開始有了進程的概念。 最早的伺服器端程式一般都是Accept一個客戶端連線就建立一個行程,然後子行程進入循環同步阻塞地與客戶端連線進行交互,收發處理資料。


多執行緒模式出現要晚一些,執行緒與進程相比更輕量,而且執行緒之間是共享記憶體堆疊的,所以不同的線程之間交互非常容易實現。例如聊天室這樣的程序,客戶端連線之間可以交互,比聊天室中的玩家可以任意的其他人傳訊息。用多執行緒模式實作非常簡單,在線程中可以直接讀寫某一個客戶端連線。而多進程模式就要用到管道、訊息佇列、共享記憶體實現資料交互,統稱進程間通訊(IPC)複雜的技術才能實現。

程式碼實例:


#

多重行程/執行緒模型的流程是

  1. 建立一個 socket,綁定伺服器連接埠(bind),監聽連接埠(listen),在PHP#stream_socket_server

  2. 一個函數就能完成上面

    #3個步驟,當然也可以使用php sockets擴展分別實作。 進入while」循環,阻塞在accept操作上,等待客戶端連線進入。此時程式會進入隨眠狀態,直到有新的客戶端發起

  3. connect
  4. 到伺服器,作業系統會喚醒此進程。 accept函數傳回客戶端連線的socket##主程序在多進程模型下透過fork#(php: pcntl_fork)建立子進程,多執行緒模型下使用pthread_create

    ##(##########php : new Thread#########)建立子執行緒。下文如無特殊宣告將使用行程同時表示進程#########/##########執行緒。 ######
  5. 子程序建立成功後進入while循環,阻塞在# recvphp: fread)呼叫上,等待客戶端傳送資料到伺服器。收到資料後伺服器程式進行處理然後使用sendphp: fwrite)向客戶端發送回應。長連線的服務會持續與客戶端交互,而短連線服務一般收到回應就會close##。

  6. 當客戶端連線關閉時,子程序退出並銷毀所有資源。主進程會回收掉此子進程。

 

這個模式最大的問題是,行程/#執行緒創建和銷毀的開銷很大。所以上面的模式沒辦法應用在非常繁忙的伺服器程式。對應的改進版解決了這個問題,這就是經典的Leader-Follower模型。

程式碼實例:


#它的特點是程式啟動後就會建立N個行程。每個子程序進入Accept#,等待新的連線進入。當客戶端連接到伺服器時,其中一個子程序會被喚醒,開始處理客戶端請求,並且不再接受新的TCP##連線。當此連線關閉時,子程序會釋放,重新進入Accept,參與處理新的連線。

這個模型的優點是完全可以重複使用進程,沒有額外消耗,效能非常好。許多常見的伺服器程式都是基於此模型的,例如##Apache#、PHP-FPM

多行程模型也有一些缺點。

  1. 這種模型嚴重依賴進程的數量來解決並發問題,一個客戶端連線就需要佔用一個進程,工作進程的數量有多少,並發處理能力就有多少。作業系統可以建立的進程數量是有限的。

  2. 啟動大量進程會帶來額外的進程調度消耗。數百個行程時可能進程上下文切換調度消耗佔CPU#不到1%#可以忽略不接,如果啟動數千甚至數萬個進程,消耗就會直線上升。調度消耗可能占到CPU的百分之幾十甚至100% #。

另外有一些場景多進程模型無法解決,例如即時聊天程式(IM),一台伺服器要同時維持上萬甚至幾十萬上百萬的連線(經典的C10K問題),多進程模型就力不從心了。

還有一種場景也是多進程模型的軟肋。通常Web伺服器啟動#100個進程,如果一個請求消耗100ms100 1000qps,這樣的處理能力還是不錯的。但如果請求內要呼叫外網Http接口,像QQ、微博登錄,耗時會很長,一個請求需要10s。那一個行程1秒只能處理#0.1個請求,

100個行程只能達到#10qps,這樣的處理能力就太差了。 有沒有一種技術可以在一個行程內處理所有並發

###IO#########呢?答案是有,這就是#########IO#########重用技術。 ######

IO複用#/事件循環 #/非同步非阻塞

#其實##IO#復用的歷史和多進程一樣長,Linux#很早就提供了##select系統調用,可以在一個行程內維持1024個連線。後來又加入了poll系統調用,poll做了一些改進,解決了1024限制的問題,可以維持任意數量的連接。但select/poll還有一個問題就是,它需要循環偵測連線是否有事件。這樣問題就來了,如果伺服器有100萬個連接,在某一時間只有一個連接向伺服器發送了數據,select/poll需要做循環100萬次,只有1次是命中的,剩下的999999 次都是無效的,白白浪費了

###CPU#########資源######。 ######

直到Linux 2.6#核心提供了新的##epoll系統調用,可以維持無限數量的連接,而且無需輪詢,這才真正解決了C10K問題。現在各種高並發非同步IO的伺服器程式都是基於epoll實現的,例如Nginx#Node.js##、ErlangGolang。像Node.js這樣單一進程單執行緒的程序,都可以維持超過1#百萬TCP連接,全部歸功於epoll## 技術。

IO

#複用非同步非阻塞程式使用經典的Reactor 模型,Reactor顧名思義就是反應器的意思,它本身不處理任何資料收發。只是可以監視一個socket句柄的事件變化。

Reactor

#有##4個核心的操作:#

  1. add新增#socket##監聽到 reactor,可以是listen socket也可以讓客戶端socketeventfd 、訊號等

  2. #set修改事件監聽,可以設定監聽的類型,如可讀、可寫入。可讀很好理解,對於listen socket就是有新客戶端連線到來了需要accept。對於客戶端連線就是收到數據,需要recv。可寫事件比較難理解一些。一個SOCKET是有快取區的,如果要連接到客戶端2M的數據,一次是發不出去的,作業系統預設##TCP#快取區只有256K。一次只能發256K,就會回傳EAGAIN錯誤。這時候就要監聽可寫事件,在純粹非同步的程式設計中,必須去監聽可寫才能保證send操作是完全非阻塞的。 del

  3. reactor# #中移除,不再監聽事件

  4. callback就是事件發生後對應的處理邏輯,一般在##add/set時制定。 C語言用函數指標實現,#JS可以用匿名函數,PHP可以用匿名函數、物件方法陣列、字串函數名。


Reactor只是一個事件產生器,實際對socket句柄的操作,如#connect/accept##、#send/recvclose是在callback 中完成的。具體編碼可參考下面的偽代碼:


#Reactor模型還可以與多進程、多執行緒結合起來用,既實現異步非阻塞IO

##IO
  • ##IO#目前流行的非同步伺服器程式都是這樣的方式:如

  • #Nginx:多進程 Reactor

  • #Nginx+Lua
  • ##:多進程Reactor+協程

    #Golang#########:單執行緒#########Reactor+#########多執行緒協程######
  • Swoole:多线程Reactor+多进程Worker


4. PHP socket内部源码

          从PHP内部源码来看,PHP提供的socket编程是在socket,bind,listen等函数外添加了一个层,让其更加简单和方便调用。但是一些业务逻辑的程序还是需要程序员自己去实现。
下面我们以socket_create的源码实现来说明PHP的内部实现。
前面我们有说到php的socket是以扩展的方式实现的。在源码的ext目录,我们找到sockets目录。这个目录存放了PHP对于socket的实现。直接搜索PHP_FUNCTION(socket_create),在sockets.c文件中找到了此函数的实现。如下所示代码:

/* {{{ proto resource socket_create(int domain, int type, int protocol) U
   Creates an endpoint for communication in the domain specified by domain, of type specified by type */
PHP_FUNCTION(socket_create)
{
        long            arg1, arg2, arg3;
        php_socket      *php_sock = (php_socket*)emalloc(sizeof(php_socket));
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lll", &arg1, &arg2, &arg3) == FAILURE) {
                efree(php_sock);
                return;
        }
 
        if (arg1 != AF_UNIX
#if HAVE_IPV6
                && arg1 != AF_INET6
#endif
                && arg1 != AF_INET) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid socket domain [%ld] specified for argument 1, assuming AF_INET", arg1);
                arg1 = AF_INET;
        }
 
        if (arg2 > 10) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid socket type [%ld] specified for argument 2, assuming SOCK_STREAM", arg2);
                arg2 = SOCK_STREAM;
        }
 
        php_sock->bsd_socket = socket(arg1, arg2, arg3);
        php_sock->type = arg1;
 
        if (IS_INVALID_SOCKET(php_sock)) {
                SOCKETS_G(last_error) = errno;
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create socket [%d]: %s", errno, php_strerror(errno TSRMLS_CC));
                efree(php_sock);
                RETURN_FALSE;
        }
 
        php_sock->error = 0;
        php_sock->blocking = 1;
                                                                                                                                           1257,1-8      61%
        ZEND_REGISTER_RESOURCE(return_value, php_sock, le_socket);
}
/* }}} */

Zend API实际对c函数socket做了包装,供PHP使用。 而在c的socket编程中,我们使用如下方式初始化socket。

//初始化Socket  
    if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){  
         printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);  
         exit(0);  
    }

5. socket函数

函數名 描述
socket_accept() 接受一個Socket連接
socket_bind() 把socket綁定在一個IP位址和連接埠上
##socket_clear_error () 清除socket的錯誤或最後的錯誤代碼##socket_close() 關閉一個socket資源
socket_connect() 開始一個socket連線
#socket_connect() 開始一個socket連線
#socket_create_listen() 在指定連接埠開啟一個socket監聽
socket_create_pair() 產生一對沒有差別的socket到一個陣列裡
socket_create() 產生一個socket ,相當於產生一個socket的資料結構
socket_get_option() 取得socket選項
socket_getpeername() 取得遠端類似主機的ip位址
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() 写数据到分散/聚合数组

6. PHP Socket模拟请求

我们使用stream_socket来模拟:

/**
 * 
 * @param $data= array=array(&#39;key&#39;=>value)
 */
function post_contents($data = array()) {
    $post = $data ? http_build_query($data) : &#39;&#39;;
    $header = "POST /test/ HTTP/1.1" . "\n";
    $header .= "User-Agent: Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.1;+SV1)" . "\n";
    $header .= "Host: localhost" . "\n";
    $header .= "Accept: */*" . "\n";
    $header .= "Referer: http://localhost/test/" . "\n";
    $header .= "Content-Length: ". strlen($post) . "\n";
    $header .= "Content-Type: application/x-www-form-urlencoded" . "\n";
    $header .= "\r\n";
    $ddd = $header . $post;
    $fp = stream_socket_client("tcp://localhost:80", $errno, $errstr, 30);
    $response = &#39;&#39;;
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        fwrite($fp, $ddd);
        $i = 1;
        while ( !feof($fp) ) {
            $r = fgets($fp, 1024);
            $response .= $r;
            //处理这一行
        }
    }
    fclose($fp);
    return $response;
}

注意,以上程序可能会进入死循环;

这个PHP的feof($fp) 需要注意的地方了,我们来分析为什么进入死循环。

        while ( !feof($fp) ) {
            $r = fgets($fp, 1024);
            $response .= $r;
        }

实际上,feof是可靠的,但是结合fgets函数一块使用的时候,必须要小心了。一个常见的做法是:


$fp = fopen("myfile.txt", "r");
while (!feof($fp)) {
   $current_line = fgets($fp);
   //对结果做进一步处理,防止进入死循环
}

当处理纯文本的时候,fgets获取最后一行字符后,foef函数返回的结果并不是TRUE。实际的运算过程如下:

 1) while()继续循环。

 2) fgets 获取倒数第二行的字符串

 3) feof返回false,进入下一次循环

 4)fgets获取最后一行数据

 5)  一旦fegets函数被调用,feof函数仍然返回的是false。所以继续执行循环

 6) fget试图获取另外一行,但实际结果是空的。实际代码没有意识到这一点,试图处理另外根本不存在的一行,但fgets被调用了,feof放回的结果仍然是false

 7)    .....

8) 进入死循环

相关推荐:

PHP Socket编程起步

以上是PHPSOCKET編程詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中