php代码测试(php测试软件)

华为云服务器特价优惠火热进行中!

2核2G2兆仅需 38 元;4核4G3兆仅需 79 元。购买时间越长越优惠!更多配置及优惠价格请咨询客服。

合作流程:
1、点击链接注册/关联华为云账号:点击跳转
2、添加客服微信号:cloud7591,确定产品方案、价格方案、服务支持方案等;
3、客服协助购买,并拉微信技术服务群,享受一对一免费技术支持服务;
技术专家在金蝶、华为、腾讯原厂有多年工作经验,并已从事云计算服务8年,可对域名、备案、网站搭建、系统部署、AI人工智能、云资源规划等上云常见问题提供更专业靠谱的服务,对相应产品提供更优惠的报价和方案,欢迎咨询。

今天给各位分享php代码测试的知识,其中也会对php测试软件进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

微信号:cloud7591
如需了解更多,欢迎添加客服微信咨询。
复制微信号

本文目录一览:

针对PHP代码的网站,如何进行白盒测试?需要什么工具配合?

用PhpUnit吧

PHPUnit是一个轻量级的PHP测试框架。它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计)。

单元测试是几个现代敏捷开发方法的基础,使得PHPUnit成为许多大型PHP项目的关键工具。这个工具也可以被Xdebug扩展用来生成代码覆盖率报告 ,并且可以与phing集成来自动测试,最后它还可以和Selenium整合来完成大型的自动化集成测试。

整套php源代码在本地怎么测试运行

那得看你这个项目是用php的框架写的还是原生php写的,如果是用框架写的,可以写个配置域名或者ip来指定访问这个项目的入口文件,如果是用原生php写的,就可以不用这么麻烦,所有php文件都可以通过localhost加文件名来访问,还有一点就是还要确定你这个项目的资源文件,例如图片、css文件、js文件,不过这些看你访问入口文件就知道了,一步一步修改配置即可,希望对你有帮助

几种常用PHP连接数据库的代码示例

PHP连接数据库之PHP连接MYSQL数据库代码

 ?php    $mysql_server_name= localhost ;  //改成自己的mysql数据库服务器   $mysql_username= root ;  //改成自己的mysql数据库用户名   $mysql_password= ;  //改成自己的mysql数据库密码   $mysql_database= mycounter ;  //改成自己的mysql数据库名   $conn=mysql_connect($mysql_server_name $mysql_username $mysql_password $mysql_database);    $sql= CREATE DATABASE mycounter  DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;    ;    mysql_query($sql);    $sql= CREATE TABLE `counter`  (`id` INT( ) UNSIGNED NOT NULL  AUTO_INCREMENT  `count` INT( )  UNSIGNED NOT NULL DEFAULT  PRIMARY KEY  ( `id` ) ) TYPE = innodb; ;    mysql_select_db($mysql_database $conn);    $result=mysql_query($sql);    //echo $sql;    mysql_close($conn);    echo "Hello!数据库mycounter已经成功建立!";    ?

PHP连接数据库之PHP连接ACCESS数据库代码方法

 ?   $conn = new ("ADODB Connection");    $connstr = "DRIVER={Microsoft Access Driver (* mdb)}; DBQ="  realpath("data/db mdb");    $conn Open($connstr);    $rs = new ("ADODB RecordSet");    $rs Open("select * from szd_t" $conn );    while(! $rs eof) {    $f = $rs Fields( );    echo $f value;    $rs MoveNext();    }    ?

PHP连接数据库之PHP连接MS SQL数据库代码方法

安装SQL服务器并添加PHP的MSSQL扩展

使用以下代码连接并测试

 ?php    $myServer = localhost; //主机   $myUser = sa; //用户名   $myPass = password; //密码   $myDB = Northwind; //MSSQL库名   $s = @mssql_connect($myServer  $myUser  $myPass)    or die(Couldnt connect to SQL Server on $myServer);    $d = @mssql_select_db($myDB  $s)    or die(Couldnt open database $myDB);    $query = SELECT TitleOfCourtesy+ +FirstName+ +LastName AS Employee ;    $query  = FROM Employees ;    $query  = WHERECountry=USA AND Left(HomePhone   ) = ( );    $result = mssql_query($query);    $numRows = mssql_num_rows($result);    echo  h    $numRows   Row   ($numRows ==   ? : s)   Returned / h ;    while($row = mssql_fetch_array($result))    {    echo  li   $row[Employee]    /li;    }    ?

PHP连接数据库之PHP连接Oracle数据库

PHP提供了两套函数与Oracle连接 分别是ORA_和OCI函数 其中ORA_函数略显陈旧 OCI函数更新据说更好一些 两者的使用语法几乎相差无几 你的PHP安装选项应该可以支持两者的使用

 ?  if ($conn=Ora_Logon("user@TNSNAME" "password"))    { echo "SUCCESS ! Connected to databasen";    }else    {echo "Failed : ( Could not connect to databasen";}    Ora_Logoff($conn);    phpinfo();    ?    lishixinzhi/Article/program/PHP/201405/30761

怎样在本地测试php代码?

准备工作 首先要下载如下软件,推荐到官网下载,如果你是像我一样只是测试,那么到skycn.com下载吧,这样比较快。

Apache

最流行的HTTP服务器软件之一。快速、可靠、可通过简单的API扩展,Perl/Python解释器可被编译到服务器中,完全免费,完全源代码开放。

我下载的是for Windows版本,目前最新版本是:2.0.54

PHP

PHP 是一种 HTML 内嵌式的语言。而PHP独特的语法混合了 C、Java、Perl 以及 PHP 式的新语法。它可以比 CGI 或者 Perl 更快速的执行动态网页。

我下载的是for Windows版本,目前最新版本是:5.0.4

MySQL

是一个多线程的,结构化查询语言(SQL)数据库服务器。SQL 在世界上是最流行的数据库语言。MySQL 的执行性能非常高,运行速度非常快,并非常容易使用。

我下载的是for Windows版本,目前最新版本是:5.0.4 Beta

phpMyAdmin

phpMyAdmin 是一个用PHP编写的,可以通过互联网控制和操作MySQL。通过phpMyAdmin可以完全对数据库进行操作。

我下载的是for Windows版本,目前最新版本是:2.6.2-pl1

安装apache和PHP

下面是我的安装记录:

选择80端口,将apache安装在 e:\apache下。

配置apache里的httpd.conf文件(conf目录下)

找到 DocumentRoot E:/apache/Apache2/htdocs 将其改为WEB目录E:/htdocs

找到 DirectoryIndex index.html index.html.var 在后面加入 index.htm index.php default.php default.html

选择模块化模式安装

找到 #LoadModule ssl_module modules/mod_ssl.so 这行,在此行后加入一行

LoadModule php5_module e:/php/php5apache2.dll

找到 AddType application/x-gzip .gz .tgz 这行,在此行后加入一行

AddType application/x-httpd-php .php

将php-5.0.4-Win32.zip里内容解压到e:\php里,找到php.ini-recommended,重命名为php.ini并拷贝到windows目录下。

NTFS上记得给服务器开PHP.ini的读权限。

查找extension_dir后面的改为e:/php/ext

查找Windows Extensions,把下面有一排的;extension=php_***.dll的分号去掉,就是支持组件了。我把 extension=php_gd2.dll extension=php_mbstring.dll extension=php_mysql.dll 的分号去掉了。

php5默认不支持mysql了,所以要为他添加支持,除了extension=php_mysql.dll去分号之外,在php目录里有个libmysql.dll文件,把它复制到系统的system32文件夹下,复制php.ini到windows目录下。

此时PHP环境基本已经配置成功

在WEB根目录里建一个名为test.php的文件内容如下

? echo phpinfo(); ?

重新启动apache服务,用浏览器打开

如果可以看到php配置输出信息就成功了

安装mysql

将mysql安装到指定目录,然后安装程序会引导你一步步配置。不过奇怪的是最后任务栏没有出现Mysql的图标。

修改mysql数据库的root密码

用cmd进入命今行模式输入如下命令: ( 注: d:\mysql 为mysql安装目录)

cd d:\mysql\bin

mysqladmin -u root -p password 123456

回车出现

Enter password: ( 注:这是叫你输入原密码. 刚安装时密码为空,所以直接回车即可)

此时mysql 中账号 root 的密码 被改为 123456 安装完毕

配置php.ini并测试mysql

找到extension_dir = ./ 改为 extension_dir = e:/php/ext

找到

;extension=php_mysql.dll

将';'去掉改为

extension=php_mysql.dll

找到

;session.save_path = /tmp

将';'去掉 设置你保存session的目录,如

session.save_path = e:/php/session_temp

重启apache服务

在Web根目录下建立testdb.php文件内容如下:

?php

$link=mysql_connect('localhost','root','123456');

if(!$link) echo fail;

else echo success;

mysql_close();

?

用浏览器打开 如果输出success就OK了

phpmyadmin的安装配置

将phpMyAdmin-V2.6.2-pl1.zip解压到WEB根目录中去,重命名文件夹为phpmyadmin或其它

打开phpmyadmin 目录中的 config.inc.php

找到

$cfg['Servers'][$i]['user'] = 'root';

$cfg['Servers'][$i]['password'] = '123456';

分别填上用户名和密码

在测试PHP代码时,显示指定的网页无法访问,是什么原因?

IIS状态代码的含义 \x0d\x0a概要 \x0d\x0a当用户试图通过HTTP或文件传输协议(FTP)访问一台正在运行Internet信息服务(IIS)的服务器上的内容时,IIS返回一个表示该请求的状态的数字代码。该状态代码记录在IIS日志中,同时也可能在Web浏览器或FTP客户端显示。状态代码可以指明具体请求是否已成功,还可以揭示请求失败的确切原因。 \x0d\x0a更多信息 \x0d\x0a日志文件的位置 \x0d\x0a在默认状态下,IIS把它的日志文件放在%WINDIR\System32\Logfiles文件夹中。每个万维网(WWW)站点和FTP站点在该目录下都有一个单独的目录。在默认状态下,每天都会在这些目录下创建日志文件,并用日期给日志文件命名(例如,exYYMMDD.log)。 \x0d\x0aHTTP \x0d\x0a1xx-信息提示 \x0d\x0a这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx响应。 \x0d\x0a100-继续。 \x0d\x0a101-切换协议。 \x0d\x0a2xx-成功 \x0d\x0a这类状态代码表明服务器成功地接受了客户端请求。 \x0d\x0a200-确定。客户端请求已成功。 \x0d\x0a201-已创建。 \x0d\x0a202-已接受。 \x0d\x0a203-非权威性信息。 \x0d\x0a204-无内容。 \x0d\x0a205-重置内容。 \x0d\x0a206-部分内容。 \x0d\x0a3xx-重定向 \x0d\x0a客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。 \x0d\x0a301-对象已永久移走,即永久重定向。 \x0d\x0a302-对象已临时移动。 \x0d\x0a304-未修改。 \x0d\x0a307-临时重定向。 \x0d\x0a4xx-客户端错误 \x0d\x0a发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。400-错误的请求。 \x0d\x0a401-访问被拒绝。IIS定义了许多不同的401错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在IIS日志中显示: \x0d\x0a401.1-登录失败。 \x0d\x0a401.2-服务器配置导致登录失败。 \x0d\x0a401.3-由于ACL对资源的限制而未获得授权。 \x0d\x0a401.4-筛选器授权失败。 \x0d\x0a401.5-ISAPI/CGI应用程序授权失败。 \x0d\x0a401.7_访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS6.0所专用。 \x0d\x0a403-禁止访问:IIS定义了许多不同的403错误,它们指明更为具体的错误原因: \x0d\x0a403.1-执行访问被禁止。 \x0d\x0a403.2-读访问被禁止。 \x0d\x0a403.3-写访问被禁止。 \x0d\x0a403.4-要求SSL。 \x0d\x0a403.5-要求SSL128。 \x0d\x0a403.6-IP地址被拒绝。 \x0d\x0a403.7-要求客户端证书。 \x0d\x0a403.8-站点访问被拒绝。 \x0d\x0a403.9-用户数过多。 \x0d\x0a403.10-配置无效。 \x0d\x0a403.11-密码更改。 \x0d\x0a403.12-拒绝访问映射表。 \x0d\x0a403.13-客户端证书被吊销。 \x0d\x0a403.14-拒绝目录列表。 \x0d\x0a403.15-超出客户端访问许可。 \x0d\x0a403.16-客户端证书不受信任或无效。 \x0d\x0a403.17-客户端证书已过期或尚未生效。 \x0d\x0a403.18-在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS6.0所专用。 \x0d\x0a403.19-不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS6.0所专用。 \x0d\x0a403.20-Passport登录失败。这个错误代码为IIS6.0所专用。 \x0d\x0a404-未找到。 \x0d\x0a404.0-(无)_没有找到文件或目录。 \x0d\x0a404.1-无法在所请求的端口上访问Web站点。 \x0d\x0a404.2-Web服务扩展锁定策略阻止本请求。 \x0d\x0a404.3-MIME映射策略阻止本请求。 \x0d\x0a405-用来访问本页面的HTTP谓词不被允许(方法不被允许) \x0d\x0a406-客户端浏览器不接受所请求页面的MIME类型。 \x0d\x0a407-要求进行代理身份验证。 \x0d\x0a412-前提条件失败。 \x0d\x0a413_请求实体太大。 \x0d\x0a414-请求URI太长。 \x0d\x0a415_不支持的媒体类型。 \x0d\x0a416_所请求的范围无法满足。 \x0d\x0a417_执行失败。 \x0d\x0a423_锁定的错误。 \x0d\x0a5xx-服务器错误 \x0d\x0a服务器由于遇到错误而不能完成该请求。 \x0d\x0a500-内部服务器错误。 \x0d\x0a500.12-应用程序正忙于在Web服务器上重新启动。 \x0d\x0a500.13-Web服务器太忙。 \x0d\x0a500.15-不允许直接请求Global.asa。 \x0d\x0a500.16_UNC授权凭据不正确。这个错误代码为IIS6.0所专用。 \x0d\x0a500.18_URL授权存储不能打开。这个错误代码为IIS6.0所专用。 \x0d\x0a500.100-内部ASP错误。 \x0d\x0a501-页眉值指定了未实现的配置。 \x0d\x0a502-Web服务器用作网关或代理服务器时收到了无效响应。 \x0d\x0a502.1-CGI应用程序超时。 \x0d\x0a502.2-CGI应用程序出错。application. \x0d\x0a503-服务不可用。这个错误代码为IIS6.0所专用。 \x0d\x0a504-网关超时。 \x0d\x0a505-HTTP版本不受支持。 \x0d\x0aFTP \x0d\x0a1xx-肯定的初步答复 \x0d\x0a这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。 \x0d\x0a110重新启动标记答复。 \x0d\x0a120服务已就绪,在nnn分钟后开始。 \x0d\x0a125数据连接已打开,正在开始传输。 \x0d\x0a150文件状态正常,准备打开数据连接。 \x0d\x0a2xx-肯定的完成答复 \x0d\x0a一项操作已经成功完成。客户端可以执行新命令。200命令确定。 \x0d\x0a202未执行命令,站点上的命令过多。 \x0d\x0a211系统状态,或系统帮助答复。 \x0d\x0a212目录状态。 \x0d\x0a213文件状态。 \x0d\x0a214帮助消息。 \x0d\x0a215NAME系统类型,其中,NAME是AssignedNumbers文档中所列的正式系统名称。 \x0d\x0a220服务就绪,可以执行新用户的请求。 \x0d\x0a221服务关闭控制连接。如果适当,请注销。 \x0d\x0a225数据连接打开,没有进行中的传输。 \x0d\x0a226关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。 \x0d\x0a227进入被动模式(h1,h2,h3,h4,p1,p2)。 \x0d\x0a230用户已登录,继续进行。 \x0d\x0a250请求的文件操作正确,已完成。 \x0d\x0a257已创建“PATHNAME”。 \x0d\x0a3xx-肯定的中间答复 \x0d\x0a该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。331用户名正确,需要密码。 \x0d\x0a332需要登录帐户。 \x0d\x0a350请求的文件操作正在等待进一步的信息。 \x0d\x0a4xx-瞬态否定的完成答复 \x0d\x0a该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。421服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。 \x0d\x0a425无法打开数据连接。 \x0d\x0a426Connectionclosed;transferaborted. \x0d\x0a450未执行请求的文件操作。文件不可用(例如,文件繁忙)。 \x0d\x0a451请求的操作异常终止:正在处理本地错误。 \x0d\x0a452未执行请求的操作。系统存储空间不够。 \x0d\x0a5xx-永久性否定的完成答复 \x0d\x0a该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。500语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。 \x0d\x0a501在参数中有语法错误。 \x0d\x0a502未执行命令。 \x0d\x0a503错误的命令序列。 \x0d\x0a504未执行该参数的命令。 \x0d\x0a530未登录。 \x0d\x0a532存储文件需要帐户。 \x0d\x0a550未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。 \x0d\x0a551请求的操作异常终止:未知的页面类型。 \x0d\x0a552请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。 \x0d\x0a553未执行请求的操作。不允许的文件名。 \x0d\x0a常见的FTP状态代码及其原因 \x0d\x0a150-FTP使用两个端口:21用于发送命令,20用于发送数据。状态代码150表示服务器准备在端口20上打开新连接,发送一些数据。 \x0d\x0a226-命令在端口20上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。 \x0d\x0a230-客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。 \x0d\x0a331-客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。 \x0d\x0a426-命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。 \x0d\x0a530-该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS的配置可能拒绝匿名访问。 \x0d\x0a550-命令未被执行,因为指定的文件不可用。例如,要GET的文件并不存在,或试图将文件PUT到您没有写入权限的目录。\x0d\x0a对HTTP404状态码的理解 \x0d\x0a HTTP 404 错误意味着链接指向的网页不存在,即原始网页的URL失效,这种情况经常会发生,很难避免,比如说:网页URL生成规则改变、网页文件更名或移动位置、导入链接拼写错误等,导致原来的URL地址无法访问;当Web 服务器接到类似请求时,会返回一个404 状态码,告诉浏览器要请求的资源并不存在。但是,Web服务器默认的404错误页面,无论Apache还是IIS,均十分简陋、呆板且对用户不友好,无法给用户提供必要的信息以获取更多线索,无疑这会造成用户的流失。 \x0d\x0a 因此,很多网站均使用自定义404错误的方式以提供用户体验避免用户流失。一般而言,自定义404页面通用的做法是在页面中放置网站快速导航链接、搜索框以及网站提供的特色服务,这样可以有效的帮助用户访问站点并获取需要的信息。 \x0d\x0a404错误的处理方式 \x0d\x0a(一)定制404错误页面的基本原则 \x0d\x0a 首先应明确的是,404错误应工作在服务器级而不是网页级。对定制使用动态页面如PHP脚本类型的404页时,必须确保在PHP执行前服务器已经顺利地送出“404”状态码,不然,一旦执行到了ISAPI级别,返回的状态码便只能是“200”或其他如“302”之类的重定向状态码了。 \x0d\x0a 其次,在自定义网站的404错误页面时,对设置的错误页面URL链接应使用相对路径而不是绝对路径,而且自定义404页面应该放在网站根目录下。尽管无效链接可能是多种形式的URL,但当发生404访问错误时,WEB服务器会自动将其转到自定义的当404错误页中,这跟URL的形似没有关系。 \x0d\x0a(二)Apache下设置404错误页面 \x0d\x0a 为Apache Server设置 404错误页面的方法很简单,只需在.htaccess 文件中加入如下内容即可: \x0d\x0aErrorDocument 404 /notfound.php \x0d\x0a注意: \x0d\x0a1.切记不要将404错误转向到网站主页,否则可能会导致主页在搜索引擎中消失 \x0d\x0a2.切记不要使用绝对URL(例如: 形式),如果使用绝对URL返回的状态码是“302”+“200”(已测试)\x0d\x0a(三)IIS/ASP.net下设置404错误页面 \x0d\x0a首先,修改应用程序根目录的设置,打开 “web.config” 文件编辑,在其中加入如下内容: \x0d\x0a<configuration> \x0d\x0a<system.web> \x0d\x0a<customErrors mode=”On” defaultRedirect=”error.asp”> \x0d\x0a<error statusCode=”404〃 redirect=”notfound.asp” /> \x0d\x0a</customErrors> \x0d\x0a</system.web> \x0d\x0a</configuration> \x0d\x0a注:上文例中“error.asp”为系统默认的404页面,“notfound.asp”为自定义的404页面,使用时请修改相应文件名。 \x0d\x0a然后,在自定义的404页面“notfound.asp”中加入: \x0d\x0a<% \x0d\x0aResponse.Status = “404 Not Found” \x0d\x0a%> \x0d\x0a这样,便可以保证IIS能够正确地返回“404”状态码 \x0d\x0a(四)在IIS/ASP.net下设置404静态页面 \x0d\x0a设置静态404错误页面的方法则比较简单,在IIS管理器中右键单击要管理的网站,打开“属性”中的“自定义错误信息”页,为“404”设定相应的错误信息页即可

PHP的性能探讨和测试

缘起

关于PHP 很多人的直观感觉是PHP是一种灵活的脚本语言 库类丰富 使用简单 安全 非常适合WEB开发 但性能低下 PHP的性能是否真 的就如同大家的感觉一样的差呢?本文就是围绕这么一个话题来进行探讨的 从源码 应用场景 基准性能 对比分析等几个方面深入分析PHP之性能问题 并通 过真实的数据来说话

从原理分析PHP性能

从原理分析PHP的性能 主要从以下几个方面 内存管理 变量 函数 运行机制来进行分析

内存管理

类似Nginx的内存管理方式 PHP在内部也是基于内存池 并且引入内存池的生命周期概念 在内存池方面 PHP对PHP脚本和扩展的所有内 存相关操作都进行了托管 对大内存和小内存的管理采用了不同的实现方式和优化 具体可以参考以下文档 在内存分配和回收的生命周期内 PHP采用一次初始化申请+动态扩容+内存标识回收机制 并且在每次请求结束后直 接对内存池进行重新mask

变量

总所周知 PHP是一种弱变量类型的语言 所以在PHP内部 所有的PHP变量都对应成一种类型Zval 其中具体定义如下

图一PHP变量

在变量方面 PHP做了大量的优化工作 比如说Reference counting和copy on writer机制 这样能够保证内存使用上的优化 并且减少内存拷贝次数(请参考) 在数组方面 PHP内部采用高效的hashtable来实现

函数

在PHP内部 所有的PHP函数都回转化成内部的一个函数指针 比如说扩展中函数

ZEND_FUNCTION ( my_function );//类似function my_function(){}

在内部展开后就会是一个函数

void zif_my_function ( INTERNAL_FUNCTION_PARAMETERS );

void zif_my_function(

int ht

zval * return_value

zval * this_ptr

int return_value_used

zend_executor_globals * executor_globals

);

从这个角度来看 PHP函数在内部也是对应一个函数指针

运行机制

在话说PHP性能的时候 很多人都会说“C/C++是编译型 JAVA是半编译型 PHP是解释型” 也就是说PHP是先动态解析再代码运行的 所以从这个角度来看 PHP性能必然很差

的确 从PHP脚本运行来输出 的确是一个动态解析再代码运行的过程 具体来说 PHP脚本的运行机制如下图所示

图二 PHP运行机制

PHP的运行阶段也分成三个阶段

Parse 语法分析阶段

Compile 编译产出opcode中间码

Execute 运行 动态运行进行输出

所以说 在PHP内部 本身也是存在编译的过程 并且据此产生了大量的opcode cache工具 比如说apc eacc xcache等等 这些opcode cache在生产环境基本上在标配 基于opcode cache 能到做到“PHP脚本编译一次 多次运行”的效果 从这点上 PHP就和JAVA的半编译机制非常类似

所以 从运行机制上来看 PHP的运行模式和JAVA是非常类似的 都是先产生中间码 然后运行在不同虚拟机上

动态运行

从上面的几个分析来看 PHP在内存管理 变量 函数 运行机制等几个方面都做了大量的工作 所以从原理来看 PHP 不应该存在性能问题 性能至少也应该和Java 比较接近

这个时候就不得不谈PHP动态语言的特性所带来的性能问题了 由于PHP是动态运行时 所以所有的变量 函数 对象调用 作用域实现等等都是在 执行阶段中才确定的 这个从根本上决定了PHP性能中很难改变的一些东西 在C/C++等能够在静态编译阶段确定的变量 函数 在PHP中需要在动态运行 中确定 也就决定了PHP中间码不能直接运行而需要运行在Zend Engine上

说到PHP变量的具体实现 又不得不说一个东西了 Hashtable Hashtable可以说在PHP灵魂之一 在PHP内部广泛用到 包含变量符号栈 函数符号栈等等都是基于hashtable的

以PHP变量为例来说明下PHP的动态运行特点 比如说代码

?php

$var = “hello  blog xiuwz ”;

?

该代码的执行结果就是在变量符号栈(是一个hashtable)中新增一个项

当要使用到该变量时候 就去变量符合栈中去查找(也就是变量调用对出了一个hash查找的过程)

同样对于函数调用也基本上类似有一个函数符号栈(hashtable)

其实关于动态运行的变量查找特点 在PHP的运行机制中也能看出一些 PHP代码通过解释 编译后的流程下图

图 PHP运行实例

从上图可以看出 PHP代码在pile之后 产出的了类符号表 函数符号表 和OPCODE 在真正执行的时候 zend Engine会根据op code去对应的符号表中进行查找 处理

从某种程度上 在这种问题的上 很难找到解决方案 因为这是由于PHP语言的动态特性所决定的 但是在国内外也有不少的人在寻找解决方案 因为 通过这样 能够从根本上完全的优化PHP 典型的列子有facebook的hiphop

结论

从上面分析来看 在基础的内存管理 变量 函数 运行机制方面 PHP本身并不会存在明显的性能差异 但由于PHP的动态运行特性 决定了 PHP和其他的编译型语言相比 所有的变量查找 函数运行等等都会多一些hash查找的CPU开销和额外的内存开销 至于这种开销具体有多大 可以通过后 续的基准性能和对比分析得出

因此 也可以大体看出PHP不太适合的一些场景 大量计算性任务 大数据量的运算 内存要求很严格的应用场景 如果要实现这些功能 也建议通过扩展的方式实现 然后再提供钩子函数给PHP调用 这样可以减低内部计算的变量 函数等系列开销

基准性能

对于PHP基准性能 目前缺少标准的数据 大多数同学都存在感性的认识 有人认为 QPS就是PHP的极限了 此外 对于框架的性能和框架对性能的影响很没有响应的权威数字

本章节的目的是给出一个基准的参考性能指标 通过数据给大家一个直观的了解

具体的基准性能有以下几个方面

裸PHP性能 完成基本的功能

裸框架的性能 只做最简单的路由分发 只走通核心功能

标准模块的基准性能 所谓标准模块的基准性能 是指一个具有完整服务模块功能的基准性能

环境说明

测试环境

Uname aPnux db forum test db baidu _ # SMP Wed Aug   : : CST x _ x _ x _ GNU/Pnux

Red Hat Enterprise Pnux AS release (Nahant Update )

  Intel(R) Xeon(R) CPU           E   @ GHz

软件相关

Nginx nginx version: nginx/   built by gcc (Red Hat )

Php (采用php fpm)

PHP (cP) (built: Mar  : : )

Copyright (c) The PHP Group

Zend Engine v Copyright (c) Zend Technologies

with eAccelerator v Copyright (c) eAccelerator by eAccelerator

bingo

PHP框架

其他说明

目标机器的部署方式 nginx php fpm php脚本

测试压力机器和目标机器独立部署

裸PHP性能

最简单的PHP脚本

?php

require_once ‘ /actions/indexAction php’;

$objAction = new indexAction();

$objAction init();

$objAction execute();

?

Acitons/indexAction php里面的代码如下

?php

class indexAction

{

pubPc function execute()

{

echo ‘hello  world!’;

}

}

?

通过压力工具测试结果如下

裸PHP框架性能

为了和 的对比 基于bingo 框架实现了类似的功能 代码如下

?php

require_once ‘Bingo/Controller/Front php’;

$objFrontController = Bingo_Controller_Front::getInstance(array(

‘actionDir’ = ‘ /actions’

));

$objFrontController dispatch();

压力测试结果如下

从该测试结果可以看出 框架虽然有一定的消耗 但对整体的性能来说影响是非常小的

标准PHP模块的基准性能

所谓标准PHP模块 是指一个PHP模块所必须要具体的基本功能

路由分发

自动加载

LOG初始化Notice日志打印 所以的UI请求都一条标准的日志

错误处理

时间校正

自动计算每个阶段耗时开销

编码识别编码转化

标准配置文件的解析和调用

采用bingo 的代码自动生成工具产生标准的测试PHP模块 test

测试结果如下

结论

从测试数据的结论来看 PHP本身的性能还是可以的 基准性能完全能够达到几千甚至上W的QPS 至于为什么在大多数的PHP模块中表现不佳 其实这个时候更应该去找出系统的瓶颈点 而是简单的说OK PHP不行 那我们换C来搞吧 (下一个章节 会通过一些例子来对比 采用C来处理不见得有特 别的优势)

通过基准数据 可以得出以下几个具体的结论

PHP本身性能也很不错 简单功能下能够达到 QPS 极限也能过W

PHP框架本身对性能影响非常有限 尤其是在有一定业务逻辑和数据交互的情况下 几乎可以忽略

一个标准的PHP模块 基准性能能够达到 QPS( cpu idle)

对比分析

lishixinzhi/Article/program/PHP/201311/21287

php代码测试的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于php测试软件、php代码测试的信息别忘了在本站进行查找喔。

发布于 2023-04-03 19:04:05
收藏
分享
海报
20
目录

    忘记密码?

    图形验证码

    复制成功
    微信号: cloud7591
    如需了解更多,欢迎添加客服微信咨询。
    我知道了