如何用PHP+shell实现多线程
先写一段简单的php代码,为了让脚本执行时间长一点,更容易看到效果,睡一会吧,哈哈!先看下test.php的代码:ls
PHP代码:
对于 ($i=0;$i$i++) {
回显 $i;
睡眠(10);
我们看一下shell脚本的代码。非常简单。
/bin/bash #!/bin/bash
对于我在中
做
/usr/bin/php -q /var/www/html/test.php
完毕
有没有注意到在请求PHP代码的那一行有一个符号?这个是关键,没有它,就无法进行多线程,它意味着将服务推到后台执行。因此,shell每次循环就不需要等待PHP了,等所有代码执行完之后,再去请求下一个文件,但是是同时进行的,这样就实现了多线程。下面运行shell看看效果,这里你会看到10个test.php进程又在运行,然后使用Linux的定时服务器定时请求这个shell,这在处理一些需要多线程的任务,比如批量下载的时候非常有用!
在php中使用WEB服务器实现多线程
假设我们现在正在运行文件a.php。但是在程序中我请求WEB服务器运行另一个文件b.php,那么这两个文件就会同时执行。(PS:一个链接请求发出后,无论客户端是否退出,WEB服务器都会执行)
有时候,我们想要运行的并不是另外一个文件,而是这个文件中的一部分代码,该怎么办呢?
其实参数就是用来控制a.php运行哪个程序的。
让我们看一个例子:
//a.php,b.php
PHP 代码:------------------------------------------------ ----------------------------------
()
$fp = ('', 80, $errno, $);
fputs($fp, GET /b.php?act=brnrn //这里的第二个参数是HTTP协议中指定的请求头
//如果不明白请看RFC中的定义
(美元);
A()
$fp = fopen('.log', 'w');
fputs($fp, '设置在 ' . Date('h:i:s', time()) . ()() . rn
(美元);
b()
$fp = fopen('.log', 'w');
fputs($fp, '设置在 ' . Date('h:i:s', time()) . ()() . rn
(美元);
如果 (!isset($_GET['act'])) $_GET['act'] = 'a';
如果($_GET['act'] == 'a')
();
否则,如果($_GET['act'] == 'b')b();
-------------------------------------------------- ----------------------------------
打开.log和.log,对比一下两个文件的访问时间,你会发现这两个确实是在不同的线程中运行的,有些时间是一模一样的。
以上只是一个简单的例子,你可以将其改进成其他形式。
现在PHP有了多线程,那么就有一个问题出现了,就是同步,我们知道PHP本身是不支持多线程的,所以没有像Java那样的方法,那怎么办呢?毛呢。
1.尽量不要访问同一个资源,避免冲突。但是可以同时操作数据库。因为数据库支持并发操作,所以在多线程PHP中不要对同一个文件写入数据。如果一定要写,就用其他方法同步。比如调用flock锁住文件等。或者在另一个线程中创建一个临时文件,等待文件消失 while(('xxx')); 这样表示临时文件存在的时候,表示该线程真正在操作
如果这个文件不再存在,说明其他线程已经释放了这个文件。
2. 执行完fputs后尽量不要从这边读取数据。因为要实现多线程,必须使用非阻塞模式。也就是当fgets等函数立即返回时...这样读写数据就会有问题。如果使用阻塞模式,程序就不算是多线程了。必须等上面返回后才能执行下面的程序。所以如果需要交换数据,可以使用外部文件或数据来完成。如果实在要,使用($fp)来完成。
说了这么多,这个有没有什么实际意义?什么时候需要用到这个方法?
答案是肯定的,众所周知,在一个持续读取网络资源的应用中,网络的速度是瓶颈,如果采用这种形式,就可以实现多个线程同时读取不同的页面。
我做了一个程序,可以搜索8848、soaso等商城网站的信息。还有一个程序,从阿里巴巴网站读取商业信息和公司目录,也用到了这个技术。因为这两个程序都要不断连接到他们的服务器来读取信息并保存到数据库。利用这个技术可以消除等待响应的瓶颈。
PHP中模拟多线程的三种方法
PHP语言本身是不支持多线程的,我总结了网上关于PHP模拟多线程的方法,总的来说都是利用PHP的好伙伴的多线程能力,PHP的好伙伴指的就是LINUX和LAMP。
另外既然是模拟的,就不是真正的多线程,其实就是多进程而已,进程和线程是两个不同的概念,嗯,下面的方法都是在网上找的。
1.使用LINUX操作系统
对于 ($i=0;$i$i++) {
回显 $i;
睡眠(5);
将以上内容保存为test.php,然后写入SHELL代码
/bin/bash #!/bin/bash
对于我在中
做
php -q 测试.php
完毕
2.使用fork子进程(其实也是利用LINUX操作系统)
(刻度=1);
$ = FALSE; /// 是否等待进程结束
$ = 10; /// 进程总数
$pids = array(); /// 进程 PID 数组
回显(
对于($i = 0; $i $; $i++){
$pids[$i] = ();/// 生成子进程,并从当前行开始测试运行代码,不继承父进程的数据信息
如果(!$pids[$i]){
// 子进程流程代码段
$str=;
睡眠(5+$i);
对于 ($j=0;$j$j++) {$str.=*}
echo $i - .time() . $str n
出口();
// 子进程过程代码
如果($)
对于($i = 0; $i $; $i++){
($pids[$i],$,);
echo 等待 $i - .time() .n
回显(Endn
3.使用WEB,PHP不支持多线程,但是有的,哈哈。
假设我们正在运行文件a.php。但是我在程序中请求WEB服务器运行另一个文件b.php。
那么两个文件就会同时执行。(代码同上)
当然你也可以把需要多线程处理的部分交给JAVA,然后在PHP中调用,哈哈。
('java.java');
【PHP实现多线程的两种方法】相关文章:
★ PHP 实现的购物车类示例
★ PHP获取数组键和值的方法汇总
★ PHP 联盟链接添加方法
★ PHP中遍历数组的方法总结
★ PHP 正则方法验证Email
★ 服务器端调整图片大小的PHP方法
★ PHP CURL多线程操作代码示例
★ PHP 5 种判断数组是否为空的方法
★ PHP 实施恶意 DDOS 攻击,避免带宽占用问题
★ 如何使用PHP实现修改新闻时删除图片
() 函数设置用户定义的错误处理函数。此函数用于在运行时创建用户自己的错误处理方法。此函数返回旧的错误处理程序,如果失败则返回 null。让我们看一些例子。
()
PHP 从 4.1.0 开始提供了自定义错误处理函数(),但是很少有脚本编写者知道它。这个函数可以很好的防止错误路径的泄露,当然还有很多其他的功能。
1.可以用来屏蔽错误,如果出现错误,一些信息就会暴露给用户,很有可能成为黑客攻击你网站的工具。其次,会让用户觉得你的水平很低。
2.可以记录错误信息,及时发现生产环境中的一些问题。
3.可以做相应的处理,当出现错误时,可以跳转到预先定义的错误页面,以提供更好的用户体验。
4. 可以作为调试工具使用。有时候你需要在生产环境中调试一些东西,但是又不想影响正在使用它的用户。
5. . 。 。
使用方法如下:
视图?1([,int])
我们看到的错误信息使用();包括三个部分,错误信息,错误文件的绝对地址,错误发生的行数,其实还有一种错误类型Array([type] = 1 [] = Call to ::() [file] = /home//www/aaaa/.php [line] = 67),最好不要把页面的绝对路径暴露给别人,不然就给有些人调用可乘之机。为了防止这种情况,很多人会用直接把错误信息屏蔽掉的方法,这样很不方便,如果我们想看到信息怎么办?每次都去查,是不是需要改代码,改配置,重启呢?
PHP 有函数可以解决这个问题
使用方法如下:
混合($[,int $ = E_ALL | ])
PHP函数也可以解决这个问题
使用方法如下:
int($函数)
个人觉得自己定义错误报告函数至少有三个好处:
1、不会显示文件的绝对路径,比较安全。
2. 即使确实出现了错误信息,我们也可以对错误信息进行处理,让用户看不到诸如致命错误之类的信息。更好的用户体验
3.项目上线之后,有时候还是需要帮助用户解决问题,这时候修改代码是不可避免的,但是我们也希望错误信息能够被报告出来,不让用户看到,这时候使用类似这样的功能就太好了。
我亲自做了一个小测试
(0);
('');
()
如果(($e =())=== false)
('');
如果($e['type'] == 1){
(致命错误, );
}($e['类型'] == 8){
(,);
}($e['类型'] == 2){
(,);
}别的{
(其他, );
}别的{
回显无错误
('');
($errno, $, $, $,$)
($errno) {
案件:
echo bMy 错误 [$errno] $
echo 文件 $ 中第 $ 行出现致命错误
echo,PHP...(...br/
休息;
案件:
回显 bMy [$errno] $
在文件 $ 中的第 $ 行上进行回应
echo,PHP...(...br/
休息;
案件:
回显 bMy [$errno] $
在文件 $ 中的第 $ 行上进行回应
echo,PHP...(...br/
休息;
:
echo 错误类型:[$errno]$
在文件 $ 中的第 $ 行上进行回应
echo,PHP...(...br/
休息;
真的;
班级 {
(){
::();
$a=asdf
($a 为 $d){
回显$d;
现在我们使用自定义错误处理来过滤掉实际的路径。假设有一个变量 $admin,我们用它来判断访问者是否是管理员(这个判断可以通过 IP 或登录用户 ID 来进行)
//Admin是管理员的身份判定,true就是管理员。
//自定义错误处理函数必须有这4个输入变量$errno,$,$,$,否则无效。
($errno,$,$,$)
//如果不是管理员,则过滤实际路径
如果(!管理员)
$=((,,$);
$=((,,$);
($errno)
案件:
echo 错误:[ID $errno] $(行:$ 之 $)n
echo 程序已停止运行,请联系管理员。
//遇到Error级别错误时退出脚本
休息;
案件:
echo :[ID $errno] $(行:$ 的 $)n
休息;
:
//不显示级别错误
休息;
这样就自定义了一个错误处理函数,那么如何将错误处理交给这个自定义函数呢?
//申请课程
(数组($this,
//示例方法
(
So easy,这样就很好的解决了安全性和调试便捷性的矛盾。而且还可以花点心思把错误信息做得更美观一些,以配合网站的风格。
上面的例子中我关闭了错误提示,用了自己的函数来处理错误,上面的页面会报致命错误,我们可以通过报的错误信息来控制和处理。
好的,总结一下,这里有三种用法:
Php 代码
班级 {
(){
// 到 $this
(){
// 引用 $this
($errno,$,$,$) {
//三个方法如下:
1: ( // 直接进入普通函数
2:(array(, // 转到类下的静态方法
3:$o = new ();
(array($o, // 转到类的构造函数,与下面的第四项本质相同。
4. $o = new ();
// 也可能证明:
班级 {
(){
(数组($this,//是
(){
// 到 $this
【php中使用总结】相关文章:
★ 常见问题(版本)
★ php中函数使用详解
★ 查看内容功能
★ PHP 中的类
★ PHP 正则k函数使用示例
★ PHP中6个预定义接口介绍
★ 详细讲解如何生成图像类别
★ PHP 中()用法总结
★ php中命名空间使用介绍
★php中s函数使用实例解析
这几天接触了页面缓存,有些感触。它的好处就不细说了,一般用在数据库查询比较多的页面,插入、修改、删除的页面不太适合。
PHP页面缓存主要用到ob系列函数,如(),(),()
下面是编码部分。
1.初始化函数,一般设置页面缓存路径、缓存文件命名格式等,可根据个人喜好自定义。这里用到的标识ID是加密后的$[]参数。这个函数最后还有一个if判断:如果缓存期限未过,则加载缓存文件,否则加载源文件。
()
$url = $[''];//子url,此参数一般是唯一的
$ = md5($url);
$dir = ('/','_',($['sc'],1,-4));
//目录命名方法,如
if(!($pd = .$dir.'/'))@mkdir($pd,0777) or die($pd 目录创建失败
//如缓存/页面//
('',$pd.$.'.html');
//例如 cache/page//.html
$=();//读出
if($ ($, 13, 10) time() )//对应()函数中添加的自定义表头
回声($,27);
退出(0);
真的;
2.页面缓存功能,这里用了一个trick:给缓存文件的内容增加一个头信息——过期时间,这样每次只需要将头中的过期时间与当前时间进行比较(in()函数)就可以判断缓存是否过期。
($ttl = 0)
$ttl = $ttl ? $ttl : ;//缓存时间,默认3600s
$=();//从缓存中获取内容
$ = !- -:.(time() + $ttl). .$;
//添加自定义:过期时间=生成时间+缓存时间
(,$);//写入缓存文件
();//释放缓存
3.使用函数的时候要注意这两个函数的执行顺序,别忘了()
();//页面缓存初始化
();//启用缓存
...//代码段
(60);//通常是最后一行
【PHP页面缓存ob系列函数介绍】相关文章:
★ PHP 方法将数组的键恢复为数值序列
★ PHP 过滤不存在的图片资源
★ PHP 中使用的 JS 打印函数
★ 自定义php函数生成随机密码
★ PHP 方法将字符串随机拆分为不同长度的数组
★ PHP操作缓存方法分享
★ JAVA/JSP学习系列2
★ PHP实现简单语法高亮功能实例分析
★ PHP开发中页面跳转方法总结
★ PHP 计算给定时间之前的函数使用示例
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。