php 自定义线程 停止问题 无法停止 求大神解答

呆呆l 2013-12-27 10:29:00
因为项目需要,要设置一个php程序,每天定时执行,开启停止可控。也就是当我点击开始,则php脚本在服务器不断执行某业务逻辑(不会停止)直到我点击停止才会停止。现在我们可以让他开始,却无法停止,请问为什么?代码如下:

class auto_get_data_thread {
var $runIndex = false;//控制线程
var $interval = 30;//等待抓取时间

private function run(){
while($this->runIndex){
if(!$this->runIndex)
break;
insert_postdata_init();//业务逻辑代码
sleep($this->interval);
}
}
public function start(){
echo "start()";
ignore_user_abort(TRUE);
set_time_limit(0);
$this->runIndex=true;
$this->run();
}
public function stop(){
echo "stop()";
ignore_user_abort(FALSE);
set_time_limit(1);
$this->runIndex=false;
}
}
...全文
167 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
K-dash 2013-12-28
  • 打赏
  • 举报
回复
每次发送请求到服务器执行PHP脚本时应该都是开一个新的PHP线程去运行的吧 必须让每次请求都触发的线程有共同识别的一个全局变量才能让它们判断状态来停止 我虽然没做过但想到个笨方法就是往一个文件里面写标记,比如1就是继续运行,另一个线程写入0,那原来的线程再读出来判断到是0的时候就停止..
xuzuning 2013-12-27
  • 打赏
  • 举报
回复
看来你对 web 方式的 php 运行机制都不太了解哦 你用 $_GET['data'] 做控制源 却不知每个 http 会话作用到的是同一代码的不同实例
呆呆l 2013-12-27
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
还是的,既然停不下来了,如何能接受你的控制呢? 你得把控制放在死循环中,才有可能跳出呀
修改代码后如下:

class auto_get_data_thread {
	var $runIndex = false;//控制线程
	var $interval = 30;//等待抓取时间
	var $control = 'false'; //外部控制器
	
	private function run(){	
		while($this->runIndex){
			if(!$this->runIndex){
				throw new Exception("auto_get_data_thread be stop with Exception");
				break;
			}
			if($control == 'true')
			{
				insert_postdata_init();
				sleep($this->interval);
			}else if($control == 'false'){
				break;
			}
		}		
	}
	public function start(){
		echo "start()";
		$this->control = 'true';
		echo "=".$this->control;
		ignore_user_abort(TRUE);
		set_time_limit(0);
		$this->runIndex=true;
		$this->run();
	}
	public function stop(){
		echo "stop()";
		$this->control = 'false';
		echo "=".$this->control;
		ignore_user_abort(FALSE);
		set_time_limit(1);
		$this->runIndex=false;
	}
}
$getDataThread = new auto_get_data_thread();



global $getDataThread;
$_GET['data']=='true'?$getDataThread->start():$getDataThread->stop();

现在开始后直接就不执行了。。
xuzuning 2013-12-27
  • 打赏
  • 举报
回复
还是的,既然停不下来了,如何能接受你的控制呢? 你得把控制放在死循环中,才有可能跳出呀
呆呆l 2013-12-27
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
你的 run 方法中不是有一个死循环吗? 一旦 $this->run(); 了不就退不出来了吗?
对呀,一旦开始了就停不下来了。。
xuzuning 2013-12-27
  • 打赏
  • 举报
回复
你的 run 方法中不是有一个死循环吗? 一旦 $this->run(); 了不就退不出来了吗?
呆呆l 2013-12-27
  • 打赏
  • 举报
回复
在外部调用stop来进行停止,但是现在调用也停止不掉

$getDataThread = new auto_get_data_thread();//全局变量

global $getDataThread;
$_GET['data']=='true'?$getDataThread->start():$getDataThread->stop();
呆呆l 2013-12-27
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
你在哪里点击停止?
在外部调用stop来进行停止,但是现在调用也停止不掉

global $getDataThread;
$_GET['data']=='true'?$getDataThread->start():$getDataThread->stop();
xuzuning 2013-12-27
  • 打赏
  • 举报
回复
你在哪里点击停止?
呆呆l 2013-12-27
  • 打赏
  • 举报
回复
大神求解啊!!!!!!!!!
软件名称: ========== EasyWebServer网站服务器 V1.9 软件功能: ========== 这是一款小型的Web服务器软件。它可以很快速地在您 的PC上创建一个站点,而无需IIS等庞大复杂的工具。 它的主要功能特点如下: ◇ 遵循HTTP/1.1协议标准 ◇ 支持CGI、ISAPI,支持PHP、ASP、Perl ◇ 支持自定义端口、最大连接数、网络超时 ◇ 支持自定义缺省文档列表,支持目录浏览 ◇ 支持中文UTF-8编码 ◇ 支持Cookie,支持SOAP等 ◇ 支持多线程文件下载、断点续传 ◇ 支持访问日志记录 ◇ 极少的资源占用,极快的访问速度,极简单的设置 ◇ 绿色软件,无须安装,不写注册表 ◇ VC++ SDK 编写,体积超小 运行环境: ========== Windows 98/Me/2000/XP 使用说明: ========== 1. 设置好主目录、端口号等参数后,启动服务器 点右键菜单--“浏览主页”,就可以在浏览器中看到效果了 (作为演示,可以把主目录设置为本目录下的demo子目录) 2. 如果要执行CGI/ISAPI或PHP等脚本,注意要设置相应权限,并设置相应的脚本映射 3. 如何设置以支持PHP? 1). 到http://www.php.net网站下载PHP的安装包,如php-5.2.4-Win32.zip(建议用php5) 2). 解压到硬盘某个目录,如c:\php5 3). 把目录下的php.ini-recommended改名为php.ini 4). 在桌面--我的电脑--右键--属性--高级--环境变量,在系统变量中找到Path行, 点编辑,在原来的变量值最后增加c:\php5,注意用分号分隔,确定。 5). 在EasyWebServer中点右键菜单--设置--映射,点添加按钮, 在“添加/编辑脚本映射”对话框中,扩展名栏输入php,并指定可执行文件(即解释器) 在c:\php5中有2个解释器文件, 一个是CGI版的:c:\php5\php-cgi.exe 另一个是ISAPI版的:c:\php5\php5isapi.dll 这两个随便选择一个都可以,但推荐使用ISAPI版的。确定。 6). 访问demo目录下的hello.php,应该就可以看到效果了 4. 如何设置以支持ASP? EasyWebServer对ASP的支持,目前是通过安装第三方ActiveHTML解释器来实现的,这也是在 Apache等非IIS服务器上支持ASP的方法,具体步骤如下: 1). 到网上(如华军、天空等软件下载站)下载ActiveHTML 2). 安装ActiveHTML,比如安装到C:\Program Files\seliSoft\ActiveHTML 3). 在EasyWebServer中点右键菜单--设置--映射,点添加按钮, 在“添加/编辑脚本映射”对话框中,扩展名栏输入asp,并指定可执行文件(即解释器)为 C:\Program Files\seliSoft\ActiveHTML\AHTML.exe,点确定。 4). 访问demo目录下的hello.asp,应该就可以看到效果了 5. 如何设置以支持Perl? 1). 到网上(如华军、天空等软件下载站)下载ActivePerl 2). 安装ActivePerl,比如安装到C:\Perl目录 3). 在EasyWebServer中点右键菜单--设置--映射,点添加按钮, 在“添加/编辑脚本映射”对话框中,扩展名栏输入pl,并指定可执行文件(即解释器) 在c:\perl\bin目录下有2个解释器文件, 一个是CGI版的:c:\perl\bin\perl.exe 另一个是ISAPI版的:c:\perl\bin\PerlEx30.dll 目前(1.9版)只支持CGI版的perl.exe,注意要在后面加上一个参数"%s",如下 C:\Perl\bin\perl.exe "%s" 点确定。 4). 访问demo目录下的hello.pl,应该就可以看到效果了 在Demo子目录下有CGI、ISAPI、PHP等的演示,详见Demo\readme.txt

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧