Linux搞个后台运行就好一些,Windows下还没什么好方案。

解决方案 »

  1.   

    是apache+linux的,是暗中运行的,不需要返回结果。会对首页打开的速度有影响不?除了ajax暗中调用还有什么别的方法?
      

  2.   

    这个行为可以控制的,看下面的手册:
    http://cn.php.net/manual/en/features.connection-handling.php
    http://cn.php.net/manual/en/function.ignore-user-abort.php另外你的这种做法不太好,一般的做法是写个脚本,通过计划任务来运行。类unix的计划任务一般crontab来实现。
      

  3.   


    好像用exec、system等命令运行程序试一下。楼主也可以试一下在操作系统下搞个计划会怎样。
      

  4.   

    是否继续运行,这个可以控制的。在php.ini或者脚本里都可以控制。看下面:
    http://cn.php.net/manual/en/features.connection-handling.php
    http://cn.php.net/manual/en/function.ignore-user-abort.php另外你的这种后台脚本,应该通过crontab来运行,而不是在web运行。
      

  5.   

    怎么从操作系统搞个计划任务来定时运行a.php?其实就是定时发邮件的,因为不能连着发,会被当做垃圾邮件封掉的。所以定时段发
      

  6.   

    shell> crontab -e例如:
    1 1 * * * /usr/local/bin/php a.php
    的意思是每天的凌晨1点零1分执行/usr/local/bin/php a.php
      

  7.   

    但我发邮件是通过web的php来发的啊
      

  8.   

    通过web来发?你可能没有理解php的运行方式。php和web无关,一个可以发送邮件的php脚本,同样可以以命令行脚本来运行。除非你需要获取web过来的数据,否则你完全没必要在web环境下发送邮件。
      

  9.   

    我是用phpmailer类来发邮件的,用php写观的phpmailer发邮件怎么通过命令行来发?
      

  10.   


    楼主看看这个就明白了
    http://cn2.php.net/manual/zh/features.commandline.php
      

  11.   

    首先确定你的php cli在什么地方。登录你的服务器(很有可能是通过ssh),然后输入命令which php,得到诸如/usr/local/bin/php这样的输出。
    然后你应该了解路径的概念,例如a.php,指得是当前路径下的a.php。
    最后shell> /usr/local/bin/php a.php。这行命令的意思,就是用/usr/local/bin/php去执行a.php这个脚本。命令行脚本的另外一个使用方式,是在脚本的头部加入#!/usr/local/bin/php这样的指令。当然这个你可以暂时忽略了。而且我个人感觉这种方式不是很好,因为php安装的路径还没有一个标准,不像#!/bin/sh。
      

  12.   

    这里所讨论的东西和exec,system完全无关。
      

  13.   

    楼主如果想从网页中启用当然是用exec和system函数,而不是操作系统内的计划,所以不能说是“完全无关”。
      

  14.   

    看了下上面的网页,有点了解可以在php网页里面写命令行,但没说到定时怎么做,定时每半小时执行一次怎么写?
    还有如果一定要把a.php放在/usr/local/bin/php目录下才能运行,那么a.php里include_once的文件不是包含不过来了?因为那些文件都是在网站目录里的,跟/usr/local/bin/php不在同一个目录。
      

  15.   

    你还是没有理解。1) web环境和命令行环境是毫不相关的。不存在“在php网页里写命令行”的说法。当然你可以在一个php脚本里调用一个外部命令,但是在这里,你不需要这么做。
    2) /usr/local/bin/php不是目录,是一个命令,这个命令是用来执行php脚本的。
    3) 你在web环境运行一个php脚本,实际上也类似于调用了一个/usr/local/bin/php去运行你的PHP脚本。只不过web环境里的/usr/local/bin/php有可能是做成了webserver的模块。原理是一样的。
    4)定时执行,我上面提到的crontab,是系统提供的,不是php。
    这样吧,你回答我,你是否有shell login权限,或者只是一个虚拟主机?如果没有shell login权限,马上抛弃“命令行实现”这种想法吧。
      

  16.   

    可以的,加入一个请求就行了
    只要发出请求就行了,而不论这个请求是如何发出的这是http的基本原理
      

  17.   

    web运行是这样的。
    web server-》调用php解释器-》解释器解释并执行PHP脚本,返回结果给web server-》web server把结果发送给用户浏览器命令行是这样的。
    shell-》调用php解释器(例如我上面提到的/usr/loca/bin/php)-》解释器解释并执行PHP脚本,返回结果给shell-》shell把结果输出到终端定时执行(crontab)是这样的。
    crond-》调用一个crontab策略文件-》看到有/usr/local/bin/php a.php,于是这里开始回到上面的命令行的情况。
    而这个crontab策略文件,可以通过命令crontab -e来编辑。格式如下:
    1 1 * * * /usr/local/bin/php a.php
    5个时间栏,分别是分,时,天,周,月,最后是要执行的命令,不一定是PHP,也可能是其他程序。
      

  18.   

    多谢,好祥细,我是买的远程主机,有全部权限,可以用root登录操作,我电脑装有ssh客户端, 
      

  19.   

    刚刚在准备搞搞测试,我还不了解这样写程序的结构和布局,想搞个test.php放在网站首面测试,加上下面这些代码:
    test.php的代码(不知道是不是这样,还没测试):
    #!/usr/local/bin/php
    /usr/local/bin/php   /root/wwwroot/test/a.php
      

  20.   

    crontab -e默认会调用vim作为编辑器。你必须对vim有一定了解。vim分为几个模式,最常用的就是常规模式和编辑模式
    进去之后是处于常规模式,常规模式你目前只需要了解如下操作:
    :w保存
    kjhl上下左右
    :q退出
    :wq保存并退出
    i进行编辑模式编辑模式只需要记住一个操作,esc键。这个命令退出编辑模式,返回常规模式。
      

  21.   

    与WINDOWS下的命令行差不多,只要路径正确,楼主试一下,有问题继续提。
      

  22.   

    还没搞清思路,不测试先,我在想,写个上面的test.php(如果写得正确的话)后它就能执行a.php了?那test.php由谁来执行?
    说实话,我第一次听说crontab,我得查查crontab是怎么个用法,(:
    如果用crontab,那我就不用写个test.php了,也不用在php里加#!/usr/local/bin/php了,直接就用crontab定时执行a.php就行了吗?
      

  23.   

     不是这样的。1)你ssh登录到服务器上。
    2)输出which php,看看输出是什么,/usr/local/bin/php只是一种可能的情况,还有可能是/usr/bin/php等
    3)输入crontab -e,回车。把*/1 * * * * /usr/local/bin/php  /root/wwwroot/test/a.php输入进去,保存,退出。记住,这里的“/usr/local/bin/php”只是一种可能性,不一定是这个,要看which php的输出。
    4)上面的*/1表示每分钟后台执行一次,等结果吧。
      

  24.   

    第一个问题:a.php由那个PHP开个进程独立运行,像一个程序那样。
      

  25.   

    又有一个vim?还是第一次听说,惨了,越来越复杂了,要看很多东西
      

  26.   

    又有一个vim?还是第一次听说,惨了,越来越复杂了,要看很多东西
      

  27.   

    对,用crontab来执行a.php。好吧,暂时忘记“#!/usr/local/bin/php”吧,算我多嘴,现在说这个反而给你带来困扰。你可以忽略它。#!的方式,还得要求文件是可执行的(chmod +x),对你来说似乎一下子要了解的内容太多了。忽略它。
      

  28.   

    其实不是很复杂,这些东西用着用着就习惯了。你既然有自己的独立服务器,那么这些以后肯定是要学的。就说vim吧,一个长期在unix/linux下工作的开发人员,如果不知道如何操作vim/emacs,那么大量的配置工作就无法进行了。而crontab,每个工作中的系统,几乎都有一堆的任务在里面。服务器就不说了,我自己用的电脑,就运行着将近10个crontab任务。
      

  29.   

    哦,那是不是先输入网址执行一次test.php才会产生这个进程?然后以后都不用理它了?=========
    1)你ssh登录到服务器上。 
    2)输出which php,看看输出是什么,/usr/local/bin/php只是一种可能的情况,还有可能是/usr/bin/php等 
    3)输入crontab -e,回车。把*/1 * * * * /usr/local/bin/php  /root/wwwroot/test/a.php输入进去,保存,退出。记住,这里的“/usr/local/bin/php”只是一种可能性,不一定是这个,要看which php的输出。 
    4)上面的*/1表示每分钟后台执行一次,等结果吧。
    =========
    好祥细,我which php了,是/usr/local/bin/php,/root/wwwroot/test/a.php是我网站的网页路径。
    crontab -e还没试,要写好a.php让它可以输出结果保存起来别再试,不过我懂得用了,
    另外如果主机重启原来crontab -e的任务会不会没有了?要重写再crontab -e一次吗?
    还有如果我不要了,我怎么取消crontab -e这个任务,
    有没有可能在php网页里取消这个定时任务呢?因为这样可以在网站后台取消,不用登录ssh,这样让其他人也能够取消。
      

  30.   

    crontab -e会把你的配置保存在文件里,不会因为服务器重启而消失。如果需要去掉,需要再次crontab -e去编辑,然后删除并保存即可。vim的删除当前行的命令是dd如果需要在网页里取消,需要在php里做这个逻辑处理。也就是,a.php总是被执行,但是在a.php里,可以根据条件决定是否执行某些操作。而这些条件,可以被通过web,也就是你说的网页来设置。这个和crontab已经没什么关系了。如果需要网页来直接修改crontab,就比较困难了,所以我对这个需求的实现一般就是如我上面所述一样,在php层面做逻辑处理。
      

  31.   

    我写好a.php了,要用crontab -e加任务了,回车后怎么显示这样的,没有crontab,在任意空白地方输入*/1 * * * * /usr/local/bin/php  /root/wwwroot/test/a.php吗,问清楚一点先:
    ===================================no crontab for root - using an empty one
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    Type  :quit<Enter>  to exit Vim
      

  32.   

    对,因为这是你的第一个crontab,当然是空白的。另外,我建议你先在命令行下运行“/usr/local/bin/php  /root/wwwroot/test/a.php”,确认运行没问题了,然后再放进crontab。
      

  33.   

    i进入编辑模式
    输入内容
    按键盘的esc退出到普通模式
    依次按:wq保存并退出,注意":"是"shift+;"
      

  34.   

    a.php用网址运行没问题,怎么保存和退出?我先用1分钟测试,然后正式用的时候改成30分钟
      

  35.   

    用网址运行没问题,不代表在命令行里运行没问题。
    因为在web运行,你的当前目录是脚本所在目录。而crontab运行的时候,当前目录是你的用户的home目录。如果代码涉及到目录,那么有可能无法运行。例如include或者fopen之类。如果“/usr/local/bin/php  /root/wwwroot/test/a.php”出现错误,可以改成“cd /root/wwwroot/test;/usr/local/bin/php  a.php”
      

  36.   

    ~
    crontab.21874                                                                   
    /f25bdc501e
    /code
    /DaemonPortOptions
    /3 * * * * /usr/local/bin/php  /root/wwwroot/test/a.php 
    /1 * * * * /usr/local/bin/php  /root/wwwroot/test/a.php 
    /
    /~
    [Command Line]  =========
    变成这样了啊,刚开始搞了一个3分钟的,不会保存断掉ssh重来,再搞个1分钟的就变成2个了,怎么取消一个?这样算保存了吗?接下来怎以么退出?
      

  37.   

    你先记住vim这两个模式:常规模式和编辑模式。他们是通过i和esc来切换。记住了吧。然后,你记住,编辑模式只能输入东西,按esc可退出到常规模式。最后,是常规模式。保存是:w,退出是:q,保存并退出是:wq,删除当前行是dd。你知道我在说什么吗?
      

  38.   

    :wq了,显示crontab quit了,然后我又给它一个回车它又进入一个空的crontab,怎以搞的?空的crontab怎么退出,按esc都没反应
      

  39.   

    空的crontab按:q退出如果你的crontab语法是错误的,那么本次编辑不会成功的。是“*/1 * * * * /usr/local/bin/php  /root/wwwroot/test/a.php ”,不是“/1 * * * * /usr/local/bin/php  /root/wwwroot/test/a.php ”。这两个的区别是后面一个不是*号开头,也就是说少了个*号
      

  40.   

    esc和i切换变成-- INSERT --recording的 --recording变化了,我想退出到[root@ud2556 root]# 
      

  41.   

    也就是说crontab会检测你的crontab语句是否正确,避免你输入了错误的语句,导致整个计划任务出错。所以crontab -e是很安全的,除非你正确地编辑了它,否则它不会起作用。
      

  42.   

    惨了这个recording是个什么东西,空的按q都退不出来,就在空的crontab和recording中切换
      

  43.   

    不要紧,recording表示你不小心按了q,而不是:q。你可以忽略--recording。