views:

593

answers:

5

I know there are many posts about using CRON to run a php file. But, in the world of shared hosting, and ease of setup for a user, I don't want to have to mess with that.

I found another solution online that has to do with sockets. Just wanted to get everyones take on this, and tell me if this is a good or bad idea. Sounds like it works well.

Thoughts?

//Open socket connection to cron.php
$socketcon = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10);
if($socketcon) {
$socketdata = "GET /cron.php HTTP 1.1\r\nHost: ".$_SERVER['HTTP_HOST']."\r\nConnection: Close\r\n\r\n";
fwrite($socketcon,$socketdata);
//Normally you would get all the data back with fgets and wait until $socketcon reaches feof.
//In this case, we just do this:
fclose($socketcon);
} else {
//something went wrong. Put your error handler here.
}

cron.php:

//This script does all the work.
sleep(200);
//To prove that this works we will create an empty file here, after the sleep is done.
//Make sure that the webserver can write in the directory you're testing this file in.
$handle = fopen('test.txt','w');
fclose($handle);

Found the script from a blog post: http://syn.ac/tech/13/creating-php-cronjobs-without-cron-and-php-cli/

+1  A: 

It's not a bad method, but you need to ensure that by closing the socket it isn't just terminating the script before it finishes. You can set sockets to non-blocking.

I would still use a cron job, even if it is a bit of a pain.

Xorlev
+1 I would just use cron too. Why reinvent the wheel?
Bill Karwin
A: 

A cron job basically is a cron job. you set it up, and the OS runs the job for you. I am not sure how the PHP script you got from the site works, but if it requires human intervention, then its not really called a cron job. If you don't want to use cron, you can use a loop, then use the date functions of PHP to set up a date and time. Pseudocode

while (1) {
    $d=date("d");
    if ( $d == "01" ){
        //run every 1st of month
        //code to run here
    }
}
ghostdog74
A: 

If I understand well, you would run the first script from a remote machine, making a hit on the second script that would be hosted on your cron-disabled host ? Then, thanks to a bug or weird feature of php/webserver interaction when you Close the connection immediately, the script would not timeout ?

The first part is rather common practice, there are even companies providing this very service (http://www.webcron.org/index.php?lang=english for example will automatically poke any script you want at about any time you ask it to, for a fee).

The second part is unknown to me. This seems like a bug in the php/webserver interaction to me, but I might be wrong. Anyway, I would double check whether it's a bug or not (wait, that's what your doing right now right ?) and if it proves to be legit behavior, then go for it. If it seems to be a bug, then don't rely on this as it could be fixed anytime.

Geoffrey Bachelet
A: 

Thats a functional but weird solution that assures you need to have your machine connected all the day running the first script. If you want that, I would recommend you to use a shell script using wget or curl for that purpose.

For example:

#!/bin/sh

curl -O http://www.myserver.com/cron.php 2>&1 > /var/log/remote.cron.log

But I think the solution you would love to implement if you dont have to run very syncronizedly is a check in the end of your index.php to see when it ran the script the last time, if it was more than two hours ago, then include('cron.php'). You can also store the timestamp of when ran the script in an environmental variable, to avoid performance penalty.

Pablo López Torres
I assume if you depend on a shared machine you wont be able to maintain a php script running. Even if that machine is restarted, this solution would keep working.
Pablo López Torres
A: 

As far as I understand from reading that blog post and looking at the code, this is not really a way around not having cron access, this is a way to avoid someone waiting for the server to respond on a long query. If you absolutely must have a certain script executed say every 10 minutes or so, then you'll need to use cron . If you just want to avoid having users wait for a long query to finish then this hack might work. Even with this method, I still think you're going to hit time limits if your script takes longer than what PHP allows to finish.

Reviewing wp-cron.php(mentioned in the blog link), it looks as though it is relying entirely on users visiting the site to trigger checks against a timestamped set of jobs.

These techniques are not going to be very reliable unless you have another server pinging at specific intervals. The main goal of the technique is to avoid a user waiting say like 15 seconds for clean-up or maintenance scripts to run every once in awhile, rather than a true replacement for all uses of cron.

Klinky