首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
183 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
31
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-07
php 框架应有的功能
高性能,MVC,缓存 数据缓存 与 页面缓存,生成静态html,调试模式,编译机制,类库导入,URL和路由,数据库,模块分组,自动验证和完成,扩展机制,日志,错误,惰性加载,模板引擎,行为,ORM,DAO/ActiveRecord,主题,安全性与XSS过滤,Layout,widget,依赖注入,控制反转,面向方面(AOP),事件,服务定位,命令行,rest,片段缓存,权限管理,认证,控制器,模型,驱动,类库,扩展,函数库,钩子,配置文件,消息队列,任务调度,服务提供者,服务容器,=============新版本:高性能*Env*MVC*缓存*-数据缓存浏览器缓存(http缓存)页面缓存*-(配置哪个url可缓存,及缓存时间,只有GET请求可缓存)生成静态html调试模式*编译机制-(模板有)类库导入(psr4自动导入)URL生成 *request *response *路由- (自动路由,fallback路由-,闭包路由,类路由,方法路由,分组路由,资源路由,命名路由*)数据库*session*cookie*多应用模块分组HMVC自动验证和完成扩展机制*资源控制器控制器*日志*错误*惰性加载*模板引擎*门面facade中间件 (路由中间件,控制器中间件,前置 & 后置 中间件)http客户端ORM*DAO/ActiveRecord主题安全性与XSS过滤Layout,widget,服务提供者,*[ *依赖注入,控制反转服务容器,服务定位,][面向方面(AOP),行为,事件(最好)!钩子,]命令行,rest,片段缓存,权限管理,认证,驱动,类库*,函数库*配置文件*消息队列,任务调度,
2023年08月07日
12 阅读
0 评论
0 点赞
2023-08-07
使用Apache Zookeeper分布式部署PHP应用程序
使用Apache Zookeeper分布式部署PHP应用程序原文:Distributed application in PHP with Apache Zookeeper地址: http://systemsarchitect.net/distributed-application-in-php-with-apache-zookeeper/ 这篇文章实在不错,实在忍不住翻译下来,希望对大家有用。Apache Zookeeper是我最近遇到的最酷的技术,我是在研究Solr Cloud功能的时候发现的。Solr的分布式计算让我印象深刻。你只要开启一个新的实例就能自动在Solr Cloud中找到。它会将自己分派到某个分片中,并确定出自己是一个Leader(源)还是一个副本。不一会儿,你就可以在你的那些服务器上查询到了。即便某些服务器宕机了也可以继续工作。非常动态、聪明、酷。将运行多个应用程序作为一个逻辑程序并不是什么新玩意。事实上,我在几年前就已写过类似的软件。这种架构比较让人迷惑,使用起来也费劲。为此Apache Zookeeper提供了一套工具用于管理这种软件。为什么叫Zoo?“因为要协调的分布式系统是一个动物园”。在本篇文章中,我将说明如何使用PHP安装和集成Apache ZooKeeper。我们将通过service来协调各个独立的PHP脚本,并让它们同意某个成为Leader(所以称作Leader选举)。当Leader退出(或崩溃)时,worker可检测到并再选出新的leader。ZooKeeper是一个中性化的Service,用于管理配置信息、命名、提供分布式同步,还能组合Service。所有这些种类的Service都会在分布式应用程序中使用到。每次编写这些Service都会涉及大量的修bug和竞争情况。正因为这种编写这些Service有一定难度,所以通常都会忽视它们,这就使得在应用程序有变化时变得难以管理应用程序。即使处理得当,实现这些服务的不同方法也会使得部署应用程序变得难以管理。虽然ZooKeeper是一个Java应用程序,但C也可以使用。这里就有个PHP的扩展,由Andrei Zmievski在2009创建并维护。你可以从PECL中下载,或从GitHub中直接获取PHP-ZooKeeper。要使用该扩展你首先要安装ZooKeeper。可以从官方网站下载。?12345$ tar zxfv zookeeper-3.4.5.tar.gz$ cd zookeeper-3.4.5/src/c$ ./configure --prefix=/usr/$ make$ sudo make install这样就会安装ZooKeeper的库和头文件。现在准备编译PHP扩展。?1234567$ cd$ git clone https://github.com/andreiz/php-zookeeper.git$ cd php-zookeeper$ phpize$ ./configure$ make$ sudo make install将“zookeeper.so”添加到PHP配置中。?1$ vim /etc/php5/cli/conf.d/20-zookeeper.ini因为我不需要运行在web服务环境下,所以这里我只编辑了CLI的配置。将下面的行复制到ini文件中。?1extension=zookeeper.so使用如下命令来确定扩展是否已起作用。?12$ php -m | grep zookeeperzookeeper现在是时候运行ZooKeeper了。目前唯一还没有做的是配置。创建一个用于存放所有service数据的目录。?12345$ mkdir /home/you-account/zoo$ cd$ cd zookeeper-3.4.5/$ cp conf/zoo_sample.cfg conf/zoo.cfg$ vim conf/zoo.cfg找到名为“dataDir”的属性,将其指向“/home/you-account/zoo”目录。?123456$ bin/zkServer.sh start$ bin/zkCli.sh -server 127.0.0.1:2181[zk: 127.0.0.1:2181(CONNECTED) 14] create /test 1Created /test[zk: 127.0.0.1:2181(CONNECTED) 19] ls /[test, zookeeper]此时,你已成功连到了ZooKeeper,并创建了一个名为“/test”的znode(稍后我们会用到)。ZooKeeper以树形结构保存数据。这很类似于文件系统,但“文件夹”(译者注:这里指非最底层的节点)又和文件很像。znode是ZooKeeper保存的实体。Node(节点)的说法很容易被混淆,所以为了避免混淆这里使用了znode。因为我们稍后还会使用,所以这里我们让客户端保持连接状态。开启一个新窗口,并创建一个zookeeperdemo1.php文件。?0102030405060708091011121314151617181920<?phpclass ZookeeperDemo extends Zookeeper { public function watcher( $i, $type, $key ) {echo "Insider Watcher\n"; // Watcher gets consumed so we need to set a new one $this->get( '/test', array($this, 'watcher' ) );}}$zoo = new ZookeeperDemo('127.0.0.1:2181');$zoo->get( '/test', array($zoo, 'watcher' ) );while( true ) { echo '.'; sleep(2);}现在运行该脚本。?1$ php zookeeperdemo1.php此处应该会每隔2秒产生一个点。现在切换到ZooKeeper客户端,并更新“/test”值。?1[zk: 127.0.0.1:2181(CONNECTED) 20] set /test foo这样就会静默触发PHP脚本中的“Insider Watcher”消息。怎么会这样的?ZooKeeper提供了可以绑定在znode的监视器。如果监视器发现znode发生变化,该service会立即通知所有相关的客户端。这就是PHP脚本如何知道变化的。Zookeeper::get方法的第二个参数是回调函数。当触发事件时,监视器会被消费掉,所以我们需要在回调函数中再次设置监视器。现在你可以准备创建分布式应用程序了。其中的挑战是让这些独立的程序决定哪个(是leader)协调它们的工作,以及哪些(是worker)需要执行。这个处理过程叫做leader选举,在ZooKeeper Recipes and Solutions你能看到相关的实现方法。这里简单来说就是,每个处理(或服务器)紧盯着相邻的那个处理(或服务器)。如果一个已被监视的处理(也即Leader)退出或者崩溃了,监视程序就会查找其相邻(此时最老)的那个处理作为Leader。在真实的应用程序中,leader会给worker分配任务、监控进程和保存结果。这里为了简化,我跳过了这些部分。创建一个新的PHP文件,命名为worker.php。?001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111<?phpclass Worker extends Zookeeper { const CONTAINER = '/cluster'; protected $acl = array( array( 'perms' => Zookeeper::PERM_ALL, 'scheme' => 'world', 'id' => 'anyone' ) );private $isLeader = false; private $znode; public function __construct( $host = '', $watcher_cb = null, $recv_timeout = 10000 ) {parent::__construct( $host, $watcher_cb, $recv_timeout );} public function register() {if( ! $this->exists( self::CONTAINER ) ) { $this->create( self::CONTAINER, null, $this->acl ); } $this->znode = $this->create( self::CONTAINER . '/w-', null, $this->acl, Zookeeper::<span class="KSFIND_CLASS" id="0KSFindDIV">EPHEMER</span>AL | Zookeeper::SEQUENCE ); $this->znode = str_replace( self::CONTAINER .'/', '', $this->znode ); printf( "I'm registred as: %s\n", $this->znode ); $watching = $this->watchPrevious(); if( $watching == $this->znode ) { printf( "Nobody here, I'm the leader\n" ); $this->setLeader( true ); } else { printf( "I'm watching %s\n", $watching ); }} public function watchPrevious() {$workers = $this->getChildren( self::CONTAINER ); sort( $workers ); $size = sizeof( $workers ); for( $i = 0 ; $i < $size ; $i++ ) { if( $this->znode == $workers[ $i ] ) { if( $i > 0 ) { $this->get( self::CONTAINER . '/' . $workers[ $i - 1 ], array( $this, 'watchNode' ) ); return $workers[ $i - 1 ]; } return $workers[ $i ]; } } throw new Exception( sprintf( "Something went very wrong! I can't find myself: %s/%s", self::CONTAINER, $this->znode ) );} public function watchNode( $i, $type, $name ) {$watching = $this->watchPrevious(); if( $watching == $this->znode ) { printf( "I'm the new leader!\n" ); $this->setLeader( true ); } else { printf( "Now I'm watching %s\n", $watching ); }} public function isLeader() {return $this->isLeader;} public function setLeader($flag) {$this->isLeader = $flag;} public function run() {$this->register(); while( true ) { if( $this->isLeader() ) { $this->doLeaderJob(); } else { $this->doWorkerJob(); } sleep( 2 ); }} public function doLeaderJob() {echo "Leading\n";} public function doWorkerJob() {echo "Working\n";}}$worker = new Worker( '127.0.0.1:2181' );$worker->run();打开至少3个终端,在每个终端中运行以下脚本?0102030405060708091011121314151617181920term1$ php worker.phpI'm registred as: w-0000000001Nobody here, I'm the leaderLeadingterm2$ php worker.phpI'm registred as: w-0000000002I'm watching w-0000000001Workingterm3$ php worker.phpI'm registred as: w-0000000003I'm watching w-0000000002Working现在模拟Leader崩溃的情形。使用Ctrl+c或其他方法退出第一个脚本。刚开始不会有任何变化,worker可以继续工作。后来,ZooKeeper会发现超时,并选举出新的leader。虽然这些脚本很容易理解,但是还是有必要对已使用的Zookeeper标志作注释。?1234$this->znode = $this->create( self::CONTAINER . '/w-', null, $this->acl, Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE );每个znode都是EPHEMERAL和SEQUENCE的。EPHEMRAL代表当客户端失去连接时移除该znode。这就是为何PHP脚本会知道超时。SEQUENCE代表在每个znode名称后添加顺序标识。我们通过这些唯一标识来标记worker。在PHP部分还有些问题要注意。该扩展目前还是beta版,如果使用不当很容易发生segmentation fault。比如,不能传入普通函数作为回调函数,传入的必须为方法。我希望更多PHP社区的同仁可以看到Apache ZooKeeper的好,同时该扩展也会获得更多的支持。ZooKeeper是一个强大的软件,拥有简洁和简单的API。由于文档和示例都做的很好,任何人都可以很容易的编写分布式软件。让我们开始吧,这会很有趣的。相关连接:Yahoo research on ZooKeeper. 非常好的阅读材料,拥有真实的应用程序示例。如果你只要阅读一份ZooKeeper的资料,那么就是这份了。PHP ZooKeeperPHP ZooKeeper APIPHP ZooKeeper example
2023年08月07日
23 阅读
0 评论
0 点赞
2023-08-07
基于linux和php的稳定的分布式数据采集架构
基于linux和php的稳定的分布式数据采集架构数据采集对于一些网站至关重要,在开发这种采集程序时会遇到如下一些问题:一、单进程采集慢,采集任务的间隔时间无法控制。二、数据下载部分和分析部分不分离导致可移植性不强,调试困难。三、采集程序受机器性能瓶颈和网速瓶颈限制。四、遭受数据源的封锁。等等。。。。这就要求采集程序必须足够智能化,有如下几点要求:一、可以多机器分布运行,以适应大量数据的采集。二、能够多并发采集,使采集任务的运行周期可控。三、下载程序和分析程序分离,不仅是程序上的分离,也需要机器上的分离。四、能够很容易的加入新的采集任务,很容易的调试。五、对采集页面内容的分析能够模糊匹配。六、下载时能够调用代理。七、长期自动维护一个有效的代理列表经过几次大的改动,我现在设计的基于linux和php的采集程序架构如下:Snatch(主目录)|-Lib(类库、函数、配置的目录)| |-Config.inc.php(主程序变量配置)| |-OtherConfig.inc.php(其他配置文件若干)| |-Functions.inc.php(函数文件若干)| |-Classes.inc.php(类库文件若干)| |-ClassLocalDB.inc.php(连接本地数据库的操作类)| |-ClassRemoteDB.inc.php(连接远程数据库的操作类)| |-ClassLog.inc.php(写下载分析的日志)|-Paser(分析器程序目录)| |-WebSite1(针对WebSite1的分析程序目录)| | |-WebSite1Paser1.php(针对WebSite1的分析程序1)| | |-WebSite1Paser2.php(针对WebSite1的分析程序2)| |-WebSite2(针对WebSite2的分析程序目录)| |-ProxyWebSite1(分析代理服务器列表的站点1,取得代理服务器地址并入库)| |-ProxyWebSite2(分析代理服务器列表的站点2,取得代理服务器地址并入库)| |-... ...|-Log(日志目录)| |-WebSite1.log(WebSite1的下载及数据分析日志)| |-WebSite2.log(WebSite2的下载及数据分析日志)| |-... ...|-Files(下载后的文件保存目录)|-Main.php(主入口程序,分配下载任务)|-Assign.php(取得下载任务,分配给Down.php执行)|-Down.php(进行下载并将下载保存的文件调出来分析)|-DelOvertimeData.php(清除很老的下载文件)|-ErrorNotice.php(监控下载程序,在其出错时发信通知相关人)|-Proxy.php(校验数据库中的代理列表,分析其有效性及连接速度)|-Fork(钩子程序,使下载和分析并发)|-Main.sh(封装Main.php,使其在shell下运行不出现包含路径错误)|-Assign.sh(封装Assign.php)|-DelOvertimeData.sh(封装DelOvertimeData.php)|-ErrorNotice.sh(封装ErrorNotice.php)|-Proxy.sh(封装Proxy.php)本地数据库表结构如下(简单介绍):DownloadList表:ID int(10) unsigned NOT NULL auto_increment, 自增IDParentID int(11) NOT NULL default '0', 父ID,也就是该记录由哪个下载记录衍生来的SiteName char(32) NOT NULL default '', 采集网站的名称或代号LocalServerName char(32) NOT NULL default '', 该采集任务由本地若干台机器里的哪一台来完成URL char(255) NOT NULL default '', 需要下载的数据页地址FileName char(64) NOT NULL default '', 下载后保存的文件名FileSize int(11) NOT NULL default '0', 下载后文件的大小Handler char(64) NOT NULL default '', 分析器的php文件路径,如./Paser/WebSite1/Paser1.phpStatus enum('Wait','Download','Doing','Done','Dead') NOT NULL default 'Wait', 该任务的状态ProxyID int(11) NOT NULL default '0', 该任务使用的代理ID,为0则不使用代理下载Remark char(100) NOT NULL default '', 备注字段WaitAddTime datetime NOT NULL default '0000-00-00 00:00:00', 记录加入进行等待的时间DownloadAddTime datetime NOT NULL default '0000-00-00 00:00:00', 记录开始下载的时间DoingAddTime datetime NOT NULL default '0000-00-00 00:00:00', 记录开始分析的时间DoneAddTime datetime NOT NULL default '0000-00-00 00:00:00', 记录完成的时间ProxyList表:ID int(11) NOT NULL auto_increment, 自增IDProxy char(30) NOT NULL default '', 代理地址,如: 127.0.0.1:8080Status enum('Bad','Good','Perfect') NOT NULL default 'Bad', 该代理状态SocketTime float NOT NULL default '3', 本地连接该代理socket时间UsedCount int(11) NOT NULL default '0', 被使用的次数AddTime datetime NOT NULL default '0000-00-00 00:00:00', 代理被加入列表的时间LastTime datetime NOT NULL default '0000-00-00 00:00:00', 代理被最后一次验证的时间其它相关表:(略)介绍几个文件(只介绍,不贴代码):一、Main.phpclose();?>二、Assign.php/dev/null";}$LocalDB->close();?>三、Down.php四、Proxy.php (维护有效的代理列表)方法有两种:1、对代理地址的代理端口进行socket连接。设定连接超时为3秒(3秒仍旧连不上的代理就别要了)如果连接上了,计算连接时间,并更新该代理记录的数据SocketTime字段,判断其Status是Bad, Good,还是Perfect2、对于非Bad的代理,进行下载文件的实验,如果没使用代理下载的文件和使用代理下载的文件一样,则该代理真实有效。程序略多台机器分布式采集:只有一台运行Main.sh,2分钟运行一次。其他机器运行Assign.sh,1分钟一次,Assign.php会根据DownloadList表里的LocalServerName字段来取回任务并完成它。LocalServerName值由Main.php加载采集任务时分配。这个也可以根据各采集机器负载情况来自动调整。日志:采集分析的日志写如Log目录,以便方便的查看到是否采集到数据,分析程序是否有效,在出现错误时也可以找到错误的可能地点和时间。有点复杂,我只写了大体思路,页面分析部分没有涉及,但是也非常重要。后台管理也没谈。架起来之后很爽,只要你采集的机器多,建一个qihoo没问题。我给以前公司做的采集就是这个架构,采集sina, tom, 163等等一共143个频道的内容。对某几个网站收费数据的精确采集和分析也用的这个(当然,需要模拟登录)。还是相当稳定的
2023年08月07日
8 阅读
0 评论
0 点赞
2023-08-07
php里设置浏览器缓存
php里设置浏览器缓存$lastModified = time() + 30;header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT'); 此行设置后,会去服务器检查是否过期(文件是否修改过),如果没过期,就取本地文件(服务器需要返回header)header('Expires: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT'); 此行设置后,不再去服务器检查是否过期,直接取本地文件。header('Cache-Control: max-age=1'); (相对于本地时间 )还有一个Etag,是比较字符串,而不是时间。下面这段代码是禁止点后退后,缓存.header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');// HTTP/1.1header('Cache-Control: private, no-store, no-cache, must-revalidate');header('Cache-Control: post-check=0, pre-check=0, max-age=0', false);psheader("Content-Type: application/json");//有时要加上这句,不然不起作用(看nginx配置)<?php// 这是一个缓存测试 $cache_time = 60*10; //十分钟缓存$modified_time = @$_SERVER['HTTP_IF_MODIFIED_SINCE']; if( strtotime($modified_time)+$cache_time > time() ){header("HTTP/1.1 304"); exit; } header("Last-Modified: ".gmdate("D, d M Y H:i:s", time() )." GMT"); header("Content-Type: application/json");//有时要加上这句,不然不起作用(看nginx配置) echo ""; echo date('Y-m-d H:i:s',time()); echo 222222; ?>
2023年08月07日
13 阅读
0 评论
0 点赞
2023-08-07
PHP下的命令行执行
PHP下的命令行执行PHP 的命令行模式以下是 PHP 二进制文件(即 php.exe 程序)提供的命令行模式的选项参数,您随时可以通过 PHP -h 命令来查询这些参数。Usage: php [options] [-f] [args...]php [options] -r [args...]php [options] [-- args...]-s Display colour syntax highlighted source.-w Display source with stripped comments and whitespace.-f Parse .-v Version number-c | Look for php.ini file in this directory-a Run interactively-d foo[=bar] Define INI entry foo with value 'bar'-e Generate extended information for debugger/profiler-z Load Zend extension .-l Syntax check only (lint)-m Show compiled in modules-i PHP information-r Run PHP without using script tags <?..?>-h This helpargs... Arguments passed to script. Use -- args when first argumentstarts with - or script is read from stdinCLI SAPI 模块有以下三种不同的方法来获取您要运行的 PHP 代码:在windows环境下,尽量使用双引号, 在linux环境下则尽量使用单引号来完成。让 PHP 运行指定文件。php my_script.phpphp -f "my_script.php"以上两种方法(使用或不使用 -f 参数)都能够运行给定的 my_script.php 文件。您可以选择任何文件来运行,您指定的 PHP 脚本并非必须要以 .php 为扩展名,它们可以有任意的文件名和扩展名。在命令行直接运行 PHP 代码。php -r "print_r(get_defined_constants());"在使用这种方法时,请您注意外壳变量的替代及引号的使用。注: 请仔细阅读以上范例,在运行代码时没有开始和结束的标记符!加上 -r 参数后,这些标记符是不需要的,加上它们会导致语法错误。通过标准输入(stdin)提供需要运行的 PHP 代码。以上用法给我们提供了非常强大的功能,使得我们可以如下范例所示,动态地生成 PHP 代码并通过命令行运行这些代码:$ some_application | some_filter | php | sort -u >final_output.txt以上三种运行代码的方法不能同时使用。和所有的外壳应用程序一样,PHP 的二进制文件(php.exe 文件)及其运行的 PHP 脚本能够接受一系列的参数。PHP 没有限制传送给脚本程序的参数的个数(外壳程序对命令行的字符数有限制,但您通常都不会超过该限制)。传递给您脚本的参数可在全局变量 $argv 中获取。该数组中下标为零的成员为脚本的名称(当 PHP 代码来自标准输入获直接用 -r 参数以命令行方式运行时,该名称为“-”)。另外,全局变量 $argc 存有 $argv 数组中成员变量的个数(而非传送给脚本程序的参数的个数)。只要您传送给您脚本的参数不是以 - 符号开头,您就无需过多的注意什么。向您的脚本传送以 - 开头的参数会导致错误,因为 PHP 会认为应该由它自身来处理这些参数。您可以用参数列表分隔符 -- 来解决这个问题。在 PHP 解析完参数后,该符号后所有的参数将会被原样传送给您的脚本程序。以下命令将不会运行 PHP 代码,而只显示 PHP 命令行模式的使用说明:$ php -r 'var_dump($argv);' -hUsage: php [options] [-f] [args...][...]以下命令将会把“-h”参数传送给脚本程序,PHP 不会显示命令行模式的使用说明:$ php -r "var_dump($argv);" -- -harray(2) {[0]=>string(1) "-"[1]=>string(2) "-h"}除此之外,我们还有另一个方法将 PHP 用于外壳脚本。您可以在写一个脚本,并在第一行以 #!/usr/bin/php 开头,在其后加上以 PHP 开始和结尾标记符包含的正常的 PHP 代码,然后为该文件设置正确的运行属性。该方法可以使得该文件能够像外壳脚本或 PERL 脚本一样被直接执行。!/usr/bin/php<?phpvar_dump($argv);?>假设改文件名为 test 并被放置在当前目录下,我们可以做如下操作:$ chmod 755 test$ ./test -h -- fooarray(4) {[0]=>string(6) "./test"[1]=>string(2) "-h"[2]=>string(2) "--"[3]=>string(3) "foo"}正如您所看到的,在您向该脚本传送以 - 开头的参数时,脚本仍然能够正常运行。------------------------------------------------------------------------------命令选项-----------------------------------------------------表格 23-3. 命令行选项选项名称 描 述-s 显示有语法高亮色彩的源文件。该参数使用内建机制来解析文件并为其生成一个 HTML 高亮版本并将结果写到标准输出。请注意该过程所做的只是生成了一个 [...] 的 HTML 标记符块,并不包含任何的 HTML 头。注: 该选项不能和 -r 参数同时使用。-w 显示除去了注释和空格的源代码。注: 该选项不能和 -r 参数同时使用。-f 解析并运行给定的文件名。该参数为可选参数且可以不加,仅指明需要运行的文件名即可。-v 将 PHP、PHP SAPI 及 Zend 的版本信息写入的标准输出。例如:$ php -vPHP 4.3.0-dev (cli), Copyright (c) 1997-2002 The PHP GroupZend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies-c 用该参数,您可以指定一个放置 php.ini 文件的目录,或者直接指定一个自定义的 INI 文件,其文件名可以不是 php.ini。例如:$ php -c /custom/directory/ my_script.php$ php -c /custom/directory/custom-file.ini my_script.php-a 交互地运行 PHP。-d 用该参数可以自行设置 php.ini 文件中设置变量的值,其语法为:-d configuration_directive[=value]范例:Ommiting the value part will set the given configuration directive to "1"$ php -d max_execution_time-r '$foo = ini_get("max_execution_time"); var_dump($foo);'string(1) "1"Passing an empty value part will set the configuration directive to ""php -d max_execution_time=-r '$foo = ini_get("max_execution_time"); var_dump($foo);'string(0) ""The configuration directive will be set to anything passed after the '=' character$ php -d max_execution_time=20-r '$foo = ini_get("max_execution_time"); var_dump($foo);'string(2) "20"$ php-d max_execution_time=doesntmakesense-r '$foo = ini_get("max_execution_time"); var_dump($foo);'string(15) "doesntmakesense"-e 为调试器等生成扩展信息。-z 加载 Zend 扩展库。如果仅给定一个文件名,PHP 将试图从您系统扩展库的默认路径(在 Linux 系统下,该路径通常由/etc/ld.so.conf 指定)加载该扩展库。如果您用一个绝对路径指定文件名,则系统的扩展库默认路径将不会被使用。如果用相对路径指定的文件名,PHP 则仅试图加载相对于当前目录的扩展库。-l 该参数提供了对指定 PHP 代码进行语法检查的方便的方法。如果成功,则向标准输出写入 No syntax errors detected in 字符串,并且外壳返回值为 0。如果失败,则 Errors parsing 以及内部解析器错误信息会一起被写入到标准输出,同时外壳返回值将别设置为 255。该参数将无法检查致命错误(如未定义函数),如果您希望检测之名错误,请使用 -f 参数。注: 该参数不能和 -r 一同使用。-m 使用该参数,PHP 将打印出内置以及已加载的 PHP 及 Zend 模块:$ php -m[PHP Modules]xmltokenizerstandardsessionposixpcreoverloadmysqlmbstringctype[Zend Modules]-i 该命令行参数会调用 phpinfo() 函数,并打印出结果。如果 PHP 没有正常工作,我们建议您执行 php -i 命令来查看在信息表格之前或者对应的地方是否有任何错误信息输出。请注意输出的内容为 HTML 格式,因此输出的信息篇幅较大。-r 使用该参数可以在命令行运行 PHP 代码。您无需加上 PHP 的起始和结束标识符(<?php 和 ?>),否则将会导致语法解析错误。注: 使用这种形式的 PHP 时,应个别注意避免和外壳环境进行的命令行参数替换相冲突。显示语法解析错误的范例$ php -r "$foo = get_defined_constants();"Command line code(1) : Parse error - parse error, unexpected '='这里的问题在于即时使用了双引号 ",sh/bash 仍然实行了参数替换。由于 $foo 没有被定义,被替换后它所在的位置变成了空字符,因此在运行时,实际被 PHP 读取的代码为:$ php -r " = get_defined_constants();"正确的方法是使用单引号 '。在用单引号引用的字符串中,变量不会被 sh/bash 还原成其原值。$ php -r '$foo = get_defined_constants(); var_dump($foo);'array(370) {["E_ERROR"]=>int(1)["E_WARNING"]=>int(2)["E_PARSE"]=>int(4)["E_NOTICE"]=>int(8)["E_CORE_ERROR"]=>[...]如果您使用的外壳不是 sh/bash,您可能会碰到其它的问题。请报告您碰到的 bug,或者发邮件到 phpdoc@lists.php.net。当您试图将外壳的环境变量引入到马或者用反斜线来转义字符时也可能碰到各种各样的问题,请您在使用时注意!注: -r 在 CLI SAPI 中有效,在 CGI SAPI 中无效。-h 使用该参数,您可以得到完整的命令行参数的列表及这些参数作用的简单描述。PHP 的命令行模式能使得 PHP 脚本能完全独立于 WEB 服务器单独运行。如果您使用 Unix 系统,您需要在您的 PHP 脚本的最前面加上一行特殊的代码,使得它能够被执行,这样系统就能知道用什么样的程序要运行该脚本。在 Windows 平台下您可以将 php.exe 和.php 文件的双击属性相关联,您也可以编写一个批处理文件来用 PHP 执行脚本。为 Unix 系统增加的第一行代码不会影响该脚本在 Windows 下的运行,因此您也可以用该方法编写跨平台的脚本程序。以下是一个简单的PHP 命令行程序的范例。例子 23-1. 试图以命令行方式运行的 PHP 脚本(script.php)!/usr/bin/php<?phpif ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {?>This is a command line PHP script with one option.Usage:<?php echo $argv[0]; ?> can be some word you would liketo print out. With the --help, -help, -h,or -? options, you can get this help.<?php} else {echo $argv[1];}?>在以上脚本中,我们用第一行特殊的代码来指明该文件应该由 PHP 来执行。我们在这里使用 CLI 的版本,因此不会有 HTTP 头信息输出。在您用 PHP 编写命令行应用程序时,您可以使用两个参数:$argc 和 $argv。前面一个的值是比参数个数大 1 的整数(运行的脚本本身的名称也被当作一个参数)。第二个时包含有参数的数组,其第一个元素为脚本的名称,下标为数字 0($argv[0])。在以上程序中我们检查了参数的个数是大于 1 个还是小于 1 个。即时参数是 --help、-help、-h 或 -?,我们仍然打印出帮助信息,并同时动态输出脚本的名称。如果还收到了其它参数,我们也把它们显示出来。如果您希望在 Unix 下运行以上脚本,您需要使得它成为可执行脚本,然后简单的运行 script.php echothis 或 script.php -h。在 Windows 下,您可以为此编写一个批处理文件:@c:\php\cli\php.exe script.php %1 %2 %3 %4
2023年08月07日
13 阅读
0 评论
0 点赞
1
...
90
91
92
...
112