如何在 PHP 中调用外部命令
在 PHP 中调用外部命令可以通过以下三种方式实现:
方法一:使用PHP提供的专用函数(四):
PHP 提供了 4 个用于执行外部命令的专用函数:exec()、system()、passthru()、shell_exec()。
1)exec()
原型:字符串
exec (字符串 KaTeX 解析错误:预期的“EOF”,在位置 18 处得到“&”:...mmand [,array &output [php 调用方法, int &$return_var ]] )
注意:exec 在系统外执行命令时不输出结果,但返回结果的最后一行。如果要获取结果,可以使用第二个参数并将其输出到指定字段。此字段(一条记录)表示输出的一行。也就是说,如果输出结果有 20 行,则此字段中有 20 条记录,因此如果需要重复输出调用不同系统外部命令的结果,最好在输出每个系统外部命令的结果时清除此字段 unset($output),以防止混淆。第三个参数用于获取命令执行的状态码,如果执行成功,通常返回 0。
2)系统()
原型:字符串
系统(字符串 KaTeX 解析错误:预期的“EOF”,在位置 16 处得到“&”:命令 [、int &return_var ] )
注意:system和exec的区别在于,当系统在系统外执行命令时,它直接将结果输出给浏览器,如果命令执行成功则返回true,否则返回false。第二个参数与第三个参数 exec 的含义相同。
3)直通()
原型:空直通(字符串 KaTeX 解析错误:预期的“EOF”,在位置 16 处得到“&”:命令 [、int &return_var ] )
注意:直通和系统的区别,直通直接输出结果给浏览器,不返回任何值,可以输出二进制,比如图像数据。第二个参数是可选的,即状态代码。
4)shell_exec()
原型:字符串shell_exec(字符串$cmd)。
注意:直接执行命令$cmd
需要考虑两个问题:安全性和超时
1) 安全
由于PHP基本上用于Web程序开发,因此安全性已成为考虑的一个重要方面。因此,PHP设计者为PHP增加了一个门:安全模式。如果在安全模式下运行php 调用方法,PHP 脚本将受到以下四个限制:
执行外部命令
打开文件时有一些限制
连接到 MySQL 数据库
PHP7 和 HHVM说
到PHP,肯定有人会说它是世界上最好的编程语言。仅就受欢迎程度而言,目前全球超过81.7%的服务器前端使用PHP语言,该语言驱动全球超过2亿个网站。PHP7 的正式发布于上月初发布,迎来了自 2004 年以来最大的版本更新。现在 PHP 7.0 即将发布。对于普通的PHP
网站来说,主要是IO密集型的,瓶颈在MySQL数据之上,这并不能体现PHP性能的劣势。然而,就密集估计而言,它比静态编译的语言(如 C、C++ 和 Java)差几十倍甚至数百倍。如果在PHP开发中使用更复杂的框架,如symfony,程序的性能将得到显着提高。事实上php性能,PHP 最初并不是为解决估计密集型应用场景而设计的。我们可以简单理解一下,PHP 为了提高开发效率而牺牲执行效率。
不过PHP比较流行,比如新浪微博、Facebook等小网站的大部分程序都是用PHP编写的,也就是说,在这些大规模的应用下,PHP性能较低。Facebook早期的大部分代码都是使用PHP开发的,但随着业务的快速发展,PHP执行效率成为一个越来越重要的问题。为了优化执行效率,Facebook在2008年开始使用HipHop,这是一个PHP执行引擎,最初旨在将Fackbook的大量PHP代码转换为C++,以提高性能和节省资源。使用HipHop的PHP代码提高了数倍的性能。后来,Facebook开源了HipHop平台,并逐渐发展成为今天的HHVM。HHVM取代了PHP自己的引擎Zend Engine。据说性能提高了 70%。当然,PHP官方也知道PHP最大的弱点,所以他们启动了PHP7项目,主要是构建Zend Engine引擎。PHP
7 最明显的变化是巨大的性能提升,接近 Facebook 开发的 PHP 执行引擎 HHVM。在WordPress基准测试性能测试中,速度比5.6版本快2~3倍,大大降低了视频内存占用。PHP 7 也有一些语言变化,比如添加返回类型声明和添加一些新的保留关键字。在安全性方面,删除了PHP安全模式,添加了魔法吨等。不仅如此,新版本还支持64位,并包含最新版本的Zend引擎。事实上,PHP7 在真实场景中的性能确实可以与 HHVM 相媲美,在某些场景甚至超过了 HHVM。但是,HHVM 操作复杂且是多线程的,这意味着如果线程导致崩溃,整个服务将挂起,并且不会自动重新启动。此外,它使用JIT,这意味着它重启后必须预热,如果不预热,性能会更差。而且多线程模型很难调试,非常适合追求稳定性的Web服务。
百胜安装 PHP7
要使用最新版本的PHP,您需要使用REMI存储库,这是一个包含最新PHP和MySQL软件包的Linux源代码,由Remi维护。有了这个源代码后,我使用 YUM 安装或更新了较新版本的 PHP 和 MySQL。
安装最新的 Remi 源以手动安装文件
# CentOS 6 / RHEL 6
yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# CentOS 7 / RHEL 7
yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
安装
PHP 相关组件php性能,下面提供的是在生产环境中使用的标准安装。
$ yum --enablerepo=remi,remi-php70 install
php
php-cgi
php-cli
php-fpm
php-common
php-devel
php-mysqlnd
php-mysql
php-sqlite3
php-mbstring
php-msgpack
php-mcrypt
php-bcmath
php-gd
php-xml
php-ldap
php-xmlrpc
php-opcache
php-curl
php-json
php-odbc
php-pdo
php-bz2
php-xml
php-ftp
php-imap
php-snmp
php-redis
php-memcached
检查 PHP 版本
$ php -v
PHP 7.0.9 (cli) (built: Jul 20 2016 18:08:08) ( NTS )
启动 PHP-FPM
$ service php-fpm start
此时,PHP 7.0 已安装。如果需要使用 PHP 扩展,如 redis、memcached 等,只需要使用 YUM 即可安装,如下所示:
$ yum --enablerepo=remi,remi-php70 install php-redis php-memcached
如果在 REMI 或 EPEL 源中找不到所需的扩展,则需要自动编译并安装它,这也非常简单。
还可以使用 php -m 命令查看 PHP 模块信息。
$ php -m | grep redis
redis
安装一组LNMP
参考:LNMP安装包部署实践或参考PHP 7.0版本的LNMPZabbix 3.0安装和使用解释
PHP7 性能测试
环境:4核CPU,4G内存,操作系统Centos 6.5。
首先,一点GCC编译器建议,
根据鸟哥的建议,使用更新的编译器,GCC 4.8 或更高版本,建议 GCC 4.8 或更高版本,PHP 会开放全局注册进行 opline 和 execute_data 支持,这将带来 5% 左右的性能提升。
编写一个程序(在线提供的简单测试):
在第一段中,生成一个包含 600,000 个元素的字段,通过查找键来确定键是否存在。
< ?php
$a = array();
for($i=0;$i<600000;$i++){
$a[$i] = $i;
}
foreach($a as $i)
{
array_key_exists($i, $a);
}
第一个是PHP版本5.3.17。
[root@localhost test]# time php search_by_key.php
real 0m0.389s
user 0m0.337s
sys 0m0.051s
[root@localhost test]# time php search_by_key.php
real 0m0.378s
user 0m0.308s
sys 0m0.062s
[root@localhost test]# time php search_by_key.php
real 0m0.378s
user 0m0.317s
sys 0m0.061s
接下来是 PHP 版本 7.0。
[root@localhost php7]# time php7 search_by_key.php
real 0m0.082s
user 0m0.066s
sys 0m0.014s
[root@localhost php7]# time php7 search_by_key.php
real 0m0.080s
user 0m0.058s
sys 0m0.021s
[root@localhost php7]# time php7 search_by_key.php
real 0m0.080s
user 0m0.053s
sys 0m0.026s
响应时间是 PHP7 下原始操作的 1/4。
里面还是这个方法,但是因为速率慢,所以会做一个包含6万个元素的字段来查找值。
< ?php
$a = array();
for($i=0;$i<60000;$i++){
$a[$i] = $i;
}
foreach($a as $i)
{
array_key_exists($i, $a);
}
PHP 版本 5.3.17
[root@localhost test]# time php search_by_val.php
real 0m24.296s
user 0m24.184s
sys 0m0.025s
[root@localhost test]# time php search_by_val.php
real 0m25.523s
user 0m25.317s
sys 0m0.026s
[root@localhost test]# time php search_by_val.php
real 0m26.026s
user 0m25.478s
sys 0m0.092s
等待时间总是感觉很长,三次测试,花了75秒以上。接下来,PHP 7 出来了。
[root@localhost php7]# time php7 search_by_val.php
real 0m3.362s
user 0m3.323s
sys 0m0.007s
[root@localhost php7]# time php7 search_by_val.php
real 0m3.266s
user 0m3.251s
sys 0m0.004s
[root@localhost php7]# time php7 search_by_val.php
real 0m3.290s
user 0m3.275s
sys 0m0.006s
你有吗!速度提高了近 7 倍。