file_get_contents或文件函数挂起

时间:2014-07-03 01:38:57

标签: php file-get-contents

我已经为牙科诊所开发了一个应用程序,它可以在一天的预设时间发送自动电子邮件和短信提醒。这将是安装在客户机上的本地php应用程序,因为数据库是本地的。我想把它作为月度订阅服务。为了实现订阅逻辑,我的想法是在我的服务器上保留一个文本文件,该文件将有一个到期日期。本地应用程序将读取文本文件的内容以确保订阅未过期。

现在的问题是,当我在我的脚本中使用file()或file_get_contents()函数来读取我服务器上的文本文件时(例如,www.abcde.com / demo.txt),它会永远被读取文本文件。现在,如果我直接将文本文件的url放在单独的浏览器窗口中,它会立即打开它。一旦我这样做,PHP脚本工作正常。过了一会儿,同样的循环开始了。

  • 我在这里错过了什么吗?
  • 有没有更好的方法来实现订阅逻辑?

我的php应用程序是使用wamp服务器的“本地”。

2 个答案:

答案 0 :(得分:0)

如果我理解你的意思,你想为这些消息创建一个订阅系统吗?

您可以在数据库中使用3个cols的新表:id,client_id,sub_time

看起来很容易检查客户端是否仍然是我认为的消息的订阅者。你只需要比较sub_time和当前时间,看看是否($ sub_time + 3600 * 24 * $ nb_of_day_in_last_month)> = $ current_time,或类似的......:D

答案 1 :(得分:0)

所以,我所拥有的新方法是这个,希望它能为你工作

例如文件名为:subscribes.txt(我使用',''分隔符,你可以根据它改变它)

; a comment line
43,1404399704
75,1404406800
104,1404399200
6,1404399500

小脚本

$file = 'subscribes.txt';
$delim= ','; // set the delimitor of your cols

$time = time(); // get time to use it in all the script

// this part is to get the last month number of days
$y  = date('Y'); // year
$lm = date('n') - 1; // last month
$y  = ($lm == 0) ? $y - 1 : $y; // if we are in jan., year - 1
$lm = ($lm == 0) ? 12 : $lm; // if we are in jan., last month was dec.
$lm = mktime( 0, 0, 0, $lm, 1, $y ); // so, the last month
$lm_days = intval(date("t",$lm)); // get the number of days in last month

// you can get the current month number of days with :
// $lm_days = intval(date('t'));

// end of the part


$file = file_get_contents($file); // read file content

$file = explode(PHP_EOL, $file); // transform it in array

foreach( $file as $lk => $line ){

    if( !empty($line) && !preg_match('/^;(.*)/', $line) ){ // if line not empty and don't start with ;

        $cid= null;
        $st = null;

        list($cid,$st) = explode($delim, trim($line)); // explode the 3 cols of the line

        $st = $st + 3600*24*$lm_days;

        if( $time >= $st ){

            // send notifications etc etc ... (eg: your script)
        }
        else{

            // else we will delete the line to light the file
            unset($file[$lk]);
        }
    }
}

// once done, letz write the lighted file
$file = implode(PHP_EOL, $file); // convert array to string

file_put_contents($file, $file); // put it back in the file 

当你想要添加订阅时,你只需要运行这个

$file_name = 'subscribes.txt';
$delim= ','; // set the delimitor of your cols

$time = time(); // get time to use it in all the script

$file = file_get_contents($file_name); // read file content

$file = explode(PHP_EOL, $file); // transform it in array

$file[] = $cid.$delim.time(); // add to array a new entry
// there you can add multiple entries, let it fit to you :P

$file = implode(PHP_EOL, $file); // convert array to string

file_put_contents($file, $file); // put it back in the file 

告诉我,如果它仍然挂起或其他什么,我会尝试寻找其他解决方案:)