现在的做法是,通过crontab每分钟执行一个php,这个php负责从数据库中取出邮件,然后发送问题是,如果邮件很多,每分钟执行不完,那会造成很多php进程能不能实现等这个php执行完了立即启动一个新的?不用crontab

解决方案 »

  1.   

    第一种 用crontab,你可以做个数量的限制,例如每分钟发送十个邮件,然后继续每分钟执行这个文件第二种, 创建两个程序, 一个是执行程序一直死循环的跑着, 去file 另外一个发邮件的程序 如果得到另外一个程序邮件发送成功就执行下一个
      

  2.   

    第一种 用crontab 配合SH 脚本,如果SH 脚本检测到发邮件的程序进程在运行,表示邮件没发完,则不做任何事,如果没有进程,则表示程序已执行完,启动新进程 再重新开始发邮件
    第二程 while(true) + sleep
      

  3.   

    思路:两个crontab。
    A crontab :每分钟执行一个readdb.php,这个php负责从数据库中取出邮件,并存放到一个指定文件mail_list
    B crontab :每分钟执行一个sendmail.php,这个php负责去mail_list文件中读取一个邮件地址,发送邮件,然后删除mail_list中的本条记录。
      

  4.   

    你的需求是把邮件队列中新加入的邮件不断的按一定顺序发送出去是吧?而触发方式是定时检查?最简单的方式就是while(true) + sleep然后发现它缺少守护进程,一但程序终止了工作就停止了。你之前之所以用crontab就是因为防止它不工作了,不是么:)其实问题就在于如何保证随时有进程在运行。不用crontab不是不行,但是作为php脚本你需要想办法保证它长时间正常工作。关于很多脚本同时运行,这说明你未作任何处理导致的。很多办法可以解决这个问题,比如php中通过系统命令 exec("ps aux|grep '/script/path/script_name.php'|wc -l");检查该脚本同时运行数量,更严谨些你甚至可以加个任务状态啥的保证其运行并且唯一,而且具有异常处理能力。至于拿shell写,还是perl,还是php我觉得根据实际情况你随便。呵呵。要求很高的话你可以用C写个狗。
      

  5.   

    本方法常用于crontab中防止同一进程重复运行造成数据紊乱的情形。<?php$thread  =  0;$psfile  =  "/u2/WebRoot/admin/virus/file/viruschknum_psfile";$command  =  "ps  ax  |  grep  viruschknum.php  |  grep  -v  \">  $psfile\"  |  grep  -v  \"grep\"  |  grep  -v  \"log.txt\"  >  $psfile";//$command  =  "ps  -ef  |  grep  /u2/WebRoot/admin/virus/viruschknum.php  >  $psfile";exec($command);$ps  =  file($psfile);echo  "/////\nCrontabTime:".date("Y-m-d  H:i:s")."\n";if(sizeof($ps)>1){echo  "Thread  Exists!\n";exit;}else{  echo  "Thread  isn't  Exists!  ----------->GO!\n";//...}?>
      

  6.   

    <?
    $p="/tmp/mail.pid";
    if(file_exist($p))
    exit;
    fclose(fopen($p,"wb"));//TODOunlink($p);
    ?>
      

  7.   

    居然有代码标识,试用下:
    <? 
    $p="/tmp/mail.pid"; 
    if(file_exist($p)) 
    exit; 
    fclose(fopen($p,"wb")); //TODO unlink($p); 
    ?>