Wie man einen cron-job auf eine CodeIgniter-controller, die alle die URL hingegen ist eine Abfrage ausführen, die von einer API, update die DB & E-Mails senden (CI)?
Ich habe eine web-Anwendung, die eine Abfrage über eine api, bekommt neue Informationen, änderungen der Variablen in der Datenbank und sendet E-Mails, wenn nötig (vergleicht alte und neue Variablen).
Ich arbeite mit Ubuntu-Server, und ich versuchte mehrere Varianten, um diese laufen.
mein controller sieht wie folgt aus:
class Cli_only extends CI_Controller {
public function __construct() {
parent::__construct();
is_cli() OR show_404(); //If cronjob !
$this->load->model('kas_model');
//Sets the server not to have a time out.
ini_set('max_execution_time', 0);
ini_set('memory_limit', '-1');
//Expand the array displays
ini_set('xdebug.var_display_max_depth', 5);
ini_set('xdebug.var_display_max_children', 256);
ini_set('xdebug.var_display_max_data', 1024);
}
//This function has to run every day using a corn job.
public function cron_job(){
//does stuff...
}
Also zuerst habe ich versucht mit dem regelmäßigen "curl" - Befehl auf mein cronjob:
15 15 * * * http://10.0.1.666/tools/Cli_only/cron_job
und ich habe diesen Fehler in der log-Datei:
Dec 6 15:30:01 MYserver CRON[1134]: (root) CMD (curl http://10.0.1.66/tools/Cli_only/cron_job)
Dec 6 15:30:02 MYserver CRON[1133]: (CRON) info (No MTA installed, discarding output)
laufen ein quick google auf diese, und ich bemerkte, dass ich installieren "postfix" auf meinem server, und ich Tat. Ich cron neu gestartet und bekomme:
Dec 6 16:26:01 MYserver cron[2663]: (root) RELOAD (crontabs/root)
Dec 6 16:26:01 MYserver CRON[2703]: (root) CMD (curl http://10.0.1.666/tools/Cli_only/cron_job)
Dec 6 16:26:01 MYserver postfix/pickup[2479]: 23430102E11: uid=0 from=<root>
Dec 6 16:26:01 MYserver postfix/cleanup[2707]: 23430102E11: message-id=<20151206142601.23430102E11@MYserver>
Dec 6 16:26:01 MYserver postfix/qmgr[2480]: 23430102E11: from=<root@MYserver>, size=2058, nrcpt=1 (queue active)
Dec 6 16:26:01 MYserver postfix/local[2709]: 23430102E11: to=<root@MYserver>, orig_to=<root>, relay=local, delay=0.02, delays=0.01/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Dec 6 16:26:01 MYserver postfix/qmgr[2480]: 23430102E11: removed
Immer noch, keine änderungen an der DB - und wenn es - CodeIgniter hat eine Arbeitsgruppe mailing-Konfigurationen funktionieren sollte, das aus nur mit der URL.
Ich habe versucht, laufen die Dinge wie diese:
14 16 * * * wget -O - http://10.0.1.666/tools/Cli_only/cron_job >/dev/null 2>&1
14 16 * * * curl -O - http://10.0.1.666/tools/Cli_only/cron_job >/dev/null 2>&1
14 16 * * * GET -O - http://10.0.1.666/tools/Cli_only/cron_job >/dev/null 2>&1
denen ich nicht wirklich wissen, was Sie tun - und trotzdem nicht arbeiten.
EDIT:
Nur für die klar ist, wenn ich den regler an meinem browser, funktioniert alles einwandfrei!!!
Dies ist alle meine code in den controller, der cron_job() Funktion ist direkt nach der __construct () - Funktion:
<?php
class Cli_only extends CI_Controller {
public function __construct() {
parent::__construct();
is_cli() OR show_404(); //If cronjob !
//if (!$this->input->is_cli_request()) show_error('Direct access is not allowed');
$this->load->model('kas_model');
//Sets the server not to have a time out.
ini_set('max_execution_time', 0);
ini_set('memory_limit', '-1');
//Expand the array displays
ini_set('xdebug.var_display_max_depth', 5);
ini_set('xdebug.var_display_max_children', 256);
ini_set('xdebug.var_display_max_data', 1024);
}
//This function has to run every day using a corn job.
public function cron_job(){
//1. Run the query that gets the table data from the DB('from kas table')
$data['table'] = $this->kas_model->get_kas_table();
//2. Go through each row.
foreach ( $data['table'] as $row ) {
//3.1. But first, get vars!
$kas_id = $row->kas_id;
$kas_key = $row->kas_key;
$kas_id_aaa = $row->kas_id_aaa;
$kas_id_bbb = $row->kas_id_bbb;
$kas_rank1_aaa = $row->kas_rank1_aaa;
$kas_rank2_aaa = $row->kas_rank2_aaa;
$kas_rank1_bbb = $row->kas_rank1_bbb;
$kas_rank2_bbb = $row->kas_rank2_bbb;
//3.2. move to yesterday to make place for a new query result.
$this->kas_model->move_tod_to_yes($kas_id, $kas_rank2_aaa, $kas_rank2_bbb);
//3.3. Run the key query again for today on each one of the keys and insert to DB.
if ( ($kas_id_aaa != 0) || ( !empty($kas_id_aaa) ) ) {
$aaa_rank_today = $this->get_rank_aaa_by_id_and_kw($kas_id_aaa, $kas_key);
}
if ( ($kas_id_bbb != 0) || ( !empty($kas_id_bbb) ) ) {
$bbb_rank_today = $this->get_rank_bbb_by_id_and_kw($kas_id_bbb, $kas_key);
}
//3.4. Add the new rank to rank2 in the DB.
$this->kas_model->add_new_today($kas_id, $aaa_rank_today, $bbb_rank_today);
//4. Check difference as Sag described :
$msg = '';
$send = FALSE;
//First if: aaa
if ( ($aaa_rank_today > 10 ) && ( $kas_rank2_aaa < 30 ) && ( ( abs( $aaa_rank_today - $kas_rank2_aaa ) ) > 10) ) {
$msg .= 'aaa:<br> ( (Today > 10 ) && ( Yesterday < 30 ) && ( ( |Today - Yesterday| > 10) ) ==> True. <br><br>';
$send = TRUE;
}
//Second if: aaa
if ( ( ($kas_rank2_aaa < 5) && ($aaa_rank_today > 10) ) || ( ($aaa_rank_today < 5) && ($kas_rank2_aaa > 10) ) ) {
$msg .= 'aaa: <br> ( ( (Yesterday < 5) && (Today > 10) ) || ( (Today < 5) && (Yesterday > 10) ) ) ==> True. <br> <br>';
$send = TRUE;
}
//First if: bbb
if ( ($bbb_rank_today > 10 ) && ( $kas_rank2_bbb < 30 ) && ( ( abs( $bbb_rank_today - $kas_rank2_bbb ) ) > 10) ) {
$msg .= 'bbb: <br> ( (Today > 10 ) && ( Yesterday < 30 ) && ( ( |Today - Yesterday| > 10) ) ==> True. <br><br>';
$send = TRUE;
}
//Second if: bbb
if ( ( ($kas_rank2_bbb < 5) && ($bbb_rank_today > 10) ) || ( ($bbb_rank_today < 5) && ($kas_rank2_bbb > 10) ) ) {
$msg .= 'bbb: <br> ( ( (Yesterday < 5) && (Today > 10) ) || ( (Today < 5) && (Yesterday > 10) ) ) ==> True. <br> <br>';
$send = TRUE;
}
$this->send_mail($kas_id_aaa, $kas_id_bbb, $msg, $send, $aaa_rank_today, $bbb_rank_today, $kas_rank2_aaa, $kas_rank2_bbb, $kas_key);
}
}
//Gets aaa categorys Ranking by ID.
public function get_rank_aaa_by_id_and_kw($id, $key, $query_country){
$key_for_url = rawurlencode($key);
$found = FALSE;
$i = 0;
//Create a stream for Json. That's how the code knows what to expect to get.
$context_opts = array(
'http' => array(
'method' => "GET",
'header' => "Accepts: categorylication/json\r\n"
));
$context = stream_context_create($context_opts);
while ($found == FALSE) {
//aaa Query
$json_query_aaa = "https://api.example.com:666/aaa/ajax/research_key?category_id=$id&term=$key_for_url&page_index=$i&country=$query_country&auth_token=tokentokentoken";
//Get the Json
$json_query_aaa = file_get_contents($json_query_aaa, false, $context);
//Turn Json to a PHP array
$json_query_aaa = json_decode($json_query_aaa, true);
//Finally, the main categorys array.
$json_query_aaa = $json_query_aaa['key']['phone_categorys']['category_list'];
if ( count($json_query_aaa) > 2 ) {
for ( $j=0; $j<count($json_query_aaa); $j++ ) {
if ( $json_query_aaa[$j]['id'] == $id ) {
$found = TRUE;
$rank = $json_query_aaa[$j]['rank'] + 1;
break;
}
if ($found == TRUE){
break;
}
}
$i++;
} else {
$rank = "none";
break;
}
}
return $rank;
}
//Gets bbb categorys Ranking by ID.
public function get_rank_bbb_by_id_and_kw($id, $key, $query_country){
$key_for_url = rawurlencode($key);
$found = FALSE;
$i = 0;
//Create a stream for Json. That's how the code knows what to expect to get.
$context_opts = array(
'http' => array(
'method' => "GET",
'header' => "Accepts: categorylication/json\r\n"
));
$context = stream_context_create($context_opts);
while ($found == FALSE) {
//aaa Query
$json_query_bbb = "https://api.example.com:666/bbb/research_key?category_id=$id&term=$key_for_url&page_index=$i&country=$query_country&auth_token=tokentokentoken";
//Get the Json
$json_query_bbb = file_get_contents($json_query_bbb, false, $context);
//Turn Json to a PHP array
$json_query_bbb = json_decode($json_query_bbb, true);
//Finally, the main categorys array.
$json_query_bbb = $json_query_bbb['key']['phone_categorys']['category_list'];
if ( count($json_query_bbb) > 2 ) {
for ( $j=0; $j<count($json_query_bbb); $j++ ) {
if ( $json_query_bbb[$j]['id'] == $id ) {
$found = TRUE;
$rank = $json_query_bbb[$j]['rank']+1;
}
}
$i++;
} else {
$rank = "none";
break;
}
}
return $rank;
}
//Sends to email the results
public function send_mail($id_aaa, $id_bbb, $msg, $send, $aaa_rank_today, $bbb_rank_today, $aaa_rank_yesterday, $bbb_rank_yesterday, $kas_key){
if ($send) {
$ci = get_instance();
$config['protocol'] = "smtp";
$config['smtp_host'] = "ssl://smtp.gmail.com";
$config['smtp_port'] = "465";
$config['smtp_user'] = "[email protected]";
$config['smtp_pass'] = "assword";
$config['charset'] = "utf-8";
$config['mailtype'] = "html";
$config['newline'] = "\r\n";
$config['crlf'] = "\r\n";
$config['validate'] = FALSE;
$ci->load->library('email');
$ci->email->initialize($config);
$ci->email->from('[email protected]', 'key Alerting System (KAS)');
$list = array('[email protected]', '[email protected]');
$ci->email->to($list);
$this->email->reply_to('[email protected]', 'KAS Alert');
$ci->email->subject('KAS Alert!');
$ci->email->message("key: $kas_key <br/><br/> aaa ID:$id_aaa <br> bbb ID: $id_bbb <br><br><br> $msg<br><br> aaa Rank Today: $aaa_rank_today<br> aaa Rank Yesterday: $aaa_rank_yesterday<br><br> bbb Rank Today: $bbb_rank_today<br> bbb Rank Yesterday: $bbb_rank_yesterday");
$ci->email->send();
}
}
function test(){
echo 'banana';
}
}
EDIT #2:
Dies funktioniert gut, wenn Sie nicht mit is_cli() OR show_404();
in der Konstruktion. Ich will aber diese controller arbeiten nur von einem cronjob
Bekomme ich das gleiche Ergebnis mit:
if (!$this->input->is_cli_request()) show_error('Direct access is not allowed');
14 16 * * * http://10.0.1.666/tools/Cli_only/cron_job
?Ja, bekomme ich diese Ausgabe in der log-Datei:
Dec 7 09:47:01 MYserver cron[2663]: (root) RELOAD (crontabs/root) Dec 7 09:47:01 MYserver CRON[6049]: (root) CMD (http://10.0.1.666/tools/Cli_onl$ Dec 7 09:47:01 MYserver postfix/pickup[5837]: C6668102D9A: uid=0 from=<root> Dec 7 09:47:01 MYserver postfix/cleanup[6053]: C6668102D9A: message-id=<201512$ Dec 7 09:47:01 MYserver postfix/qmgr[2480]: C6668102D9A: from=<root@MYserver>,$ Dec 7 09:47:01 MYserver postfix/local[6055]: C6668102D9A: to=<root@MYserver>, $ Dec 7 09:47:01 MYserver postfix/qmgr[2480]: C6668102D9A: removed
und keine änderungen an der DBSo, sieht aus wie der cron-job ausgeführt wird. Wir müssen sehen, was passiert im inneren
cron_job()
zu helfen.Ich bin mit der Bearbeitung meiner post in einem Sek, laufen Sie nicht Weg 😀
kann ich wissen, dass Ihr hosting ?
InformationsquelleAutor Rick Sanchez | 2015-12-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
curl -O - http://10.0.1.666/tools/Cli_only/cron_job >/dev/null 2>&1
ist nicht cli.LOCKE macht eine normale http-Anfrage an den webserver, während
cli
steht für php-Kommandozeilen-Skript.Betrieb es als cli:
Für Ihre conjob muss es sein:
BEARBEITEN
Ist es durchaus gängige Praxis zu führen
curl
Anfragen von cron-job, die haben es Profis. Zum Beispiel erlaubt es, einen cron-job, da jeder Nutzer und Garantie der Auftrag wird ausgeführt von webserver-Benutzer. Mithilfe der cli, es ist Ihre Verantwortung, den cron-job für die richtigen Benutzer, z.B.crontab -u www-data -e
wenn Ihr webserver den Benutzerwww-data
. Sonst sind Sie in Gefahr, um Durcheinander mit den Berechtigungen für temporäre Dateien wie caches, logs etc.Wenn Sie nicht sicher sind, über internals, kann es besser sein, um mit
curl
in Ihrem cron-job, aber beschränken Sie den Zugriff auf den controller für bestimmte IP-Adressen. Zum Beispiel, anstattetwas wie
Ohhh.. ich habe es, aber ich will diese URL an jeden Tag mittels CRON. und mir wurde gesagt, dass das so gemacht :X
Wenn Sie meen, wie diese:
25 13 * * * /var/www/html/tools/ php index.php Cli_only cron_job
es funktioniert nicht 🙁Sie vergaß
cd
und Semikolon =) Bitte finden Sie in den aktualisierten Antworten.Funktioniert! Danke!!!
InformationsquelleAutor Alex Blex
Ersten ich verstehe nicht, warum Sie eine crotab durch einen http-request. Sie können absolut ausführen, crontab auf Ihrem server, die 10.0.1.666,die können auch gehen, wenn es etwas falsch mit dem internet. Außerdem Sie sagte " Das funktioniert gut, wenn nicht mit is_cli() ODER show_404();' ,dass da In der crontab Sie schreiben senden einer http-Anforderung. Angenommen, Sie sind der client Und der server ist 10.0.1.666. JEDES MAL, wenn die crontab ausgeführt wird ,wird der client das senden einer http-Anforderung. Und die server-666 erhält die Anfrage dann excute den controller, dem Sie schrieb. Es ist nicht ein cli-Skript. Wenn Sie darauf bestehen, tun Sie das, indem Sie http-Anforderung. Ich habe 2 adivices(nicht beste, aber vielleicht arbeiten)
Zweite ist ,empfehle ich Ihnen, führen Sie die bash auf dem server .
InformationsquelleAutor chliang