2015-12-06 6 views
6

मेरे पास एक वेब एप्लिकेशन है जो एपीआई पर एक क्वेरी चलाता है, नई जानकारी प्राप्त करता है, डेटाबेस में चर बदलता है और यदि आवश्यक हो तो ईमेल भेजता है (पुराने और नए चर की तुलना करता है)।कोडइग्निटर नियंत्रक पर क्रॉन नौकरी कैसे चलाएं कि सभी यूआरएल एपीआई से एक क्वेरी चलाते हैं, डीबी अपडेट करते हैं और ईमेल भेजते हैं (सीआई के भीतर से)?

मैं उबंटू सर्वर के साथ काम करता हूं, और मैंने इसे चलाने के लिए कई बदलावों की कोशिश की।

मेरी नियंत्रक इस तरह दिखता है:

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... 
    } 

तो सबसे पहले मैं अपने cronjob पर नियमित रूप से 'कर्ल' आदेश का उपयोग करने की कोशिश की पर:

15 15 * * * http://10.0.1.666/tools/Cli_only/cron_job

और मैं लॉग में यह त्रुटि आई फ़ाइल:

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) 

इस पर एक त्वरित Google चला रहा है और मैंने देखा कि मुझे अपने सर्वर पर "पोस्टफिक्स" इंस्टॉल करना है, और मैंने किया। मैं क्रॉन को पुनः आरंभ और मिलती है:

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=<[email protected]> 
Dec 6 16:26:01 MYserver postfix/qmgr[2480]: 23430102E11: from=<[email protected]>, size=2058, nrcpt=1 (queue active) 
Dec 6 16:26:01 MYserver postfix/local[2709]: 23430102E11: to=<[email protected]>, 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 

फिर भी, डीबी पर कोई बदलाव नहीं - और अगर वहाँ थे - CodeIgniter एक काम मेलिंग विन्यास कि सिर्फ यूआरएल चलने से काम करना चाहिए है।

मैं इस तरह से चल रहा है बातें करने की कोशिश की:

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 

जो मैं वास्तव में नहीं जानता कि वे क्या करते हैं - और अभी भी काम नहीं करते।

संपादित करें:

बस स्पष्ट होने के लिए, अगर मैं अपने ब्राउज़र पर नियंत्रक चलाने के लिए, सब कुछ पूरी तरह से काम करता है!

<?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'; 
    } 


} 

संपादित करें # 2::

यह ठीक काम करता है जब नहीं

इस नियंत्रक में मेरी कोड के सभी है, cron_job() समारोह सही __construct() फ़ंक्शन के बाद है निर्माण समारोह में is_cli() OR show_404(); है। लेकिन मैं इस नियंत्रक केवल एक cronjob

से काम करना चाहते हैं मैं के साथ एक ही परिणाम प्राप्त:

if (!$this->input->is_cli_request()) show_error('Direct access is not allowed');

+0

क्या आपने अभी तक '14 16 * * * http: // 10.0.1.666/उपकरण/Cli_only/cron_job' चलाने की कोशिश की है? – DFriend

+0

हां, मुझे यह फ़ाइल लॉग फ़ाइल में मिलती है: '7 दिसंबर 09:47:01 माइसेवर क्रॉन [2663]: (रूट) रिलाओड (क्रोंटैब्स/रूट) 7 दिसंबर 09:47:01 माइसेवर क्रॉन [6049]: (रूट) सीएमडी (http://10.0.1.666/tools/Cli_onl$ 7 दिसंबर 09:47:01 MYServer पोस्टफिक्स/पिकअप [5837]: C6668102D9A: uid = 0 से = 7 दिसंबर 09:47:01 MYServer पोस्टफिक्स/क्लीनअप [6053]: सी 6668102 डी 9 ए: संदेश-आईडी = <201512 $ 7 दिसंबर 09:47:01 माइसेवर पोस्टफिक्स/qmgr [2480]: C6668102D9A: = , $ 7 दिसंबर 09:47: 01 माइसेवर पोस्टफिक्स/लोकल [6055]: सी 6668102 डी 9 ए: टू = <रूट @ माइसेवर>, $ 7 दिसंबर 09:47:01 माइसेवर पोस्टफिक्स/क्यूएमजीआर [2480]: सी 6668102 डी 9 ए: हटाया गया और डीबी –

+0

पर कोई बदलाव नहीं तो, ऐसा लगता है कि क्रॉन नौकरी चल रही है। हमें यह देखने की ज़रूरत है कि सहायता के लिए 'cron_job()' के अंदर क्या होता है। – DFriend

उत्तर

4

curl -O - http://10.0.1.666/tools/Cli_only/cron_job >/dev/null 2>&1 CLI नहीं है। कर्ल आपके वेबसर्वर को सामान्य http अनुरोध करता है, जबकि cli PHP कमांड लाइन स्क्रिप्ट के लिए खड़ा है।

CLI के रूप में यह चलाने के लिए:

$ cd /path/to/your/web/root 
$ php index.php tools Cli_only cron_job 

अपने conjob के लिए यह होना चाहिए:

14 16 * * * cd /path/to/project; php tools Cli_only cron_job >/dev/null 2>&1 

संपादित

यह क्रॉन जॉब से curl अनुरोधों को चलाने के लिए काफी आम बात है , जो कि यह पेशेवर है। उदाहरण के लिए यह किसी भी उपयोगकर्ता के रूप में क्रॉन नौकरी चलाने की अनुमति देता है, और गारंटी देता है कि जॉब सर्वर उपयोगकर्ता द्वारा नौकरी निष्पादित की जाती है। क्ली का उपयोग करना, सही उपयोगकर्ता के लिए क्रॉन नौकरी सेट करना आपकी ज़िम्मेदारी है, उदा। crontab -u www-data -e यदि आपका वेबसर्वर उपयोगकर्ता www-data है। अन्यथा आपको कैश, लॉग इत्यादि जैसी अस्थायी फ़ाइलों के लिए अनुमतियों के साथ गड़बड़ी का खतरा है

यदि आप आंतरिक के बारे में निश्चित नहीं हैं, तो आपके क्रॉन नौकरी में curl का उपयोग करना बेहतर हो सकता है, लेकिन नियंत्रक तक पहुंच सीमित कर सकते हैं कुछ आईपी पते।

is_cli() OR show_404(); 

के बजाय उदाहरण के उपयोग कुछ की तरह

$this->input->ip_address() == '127.0.0.1' OR show_404(); 
+0

क्या आप थोड़ा और समझा सकते हैं? मैं वास्तव में समझ में नहीं आता, यह मेरी पहली बार cronjob चला रहा है और सर्वर –

+0

ओह के साथ काम करने के लिए नया है ..मुझे मिल गया, लेकिन मैं चाहता हूं कि यह यूआरएल सीआरओएन का उपयोग करके हर दिन चलें। और मुझे बताया गया कि यह ऐसा किया गया है: एक्स –

+0

यदि आप इसे पसंद करते हैं: '25 13 * * */var/www/html/tools/php index.php Cli_only cron_job' यह काम नहीं कर रहा है :( –

1

सबसे पहले मुझे समझ नहीं आता क्यों एक http अनुरोध के माध्यम से एक crotab चलाने के लिए। आप अपने सर्वर पर एक क्रॉन्टाब चला सकते हैं जो कि 10.0.1.666 है, जो इंटरनेट के साथ कुछ गलत होने पर भी आगे बढ़ सकता है। इसके अलावा आपने कहा 'यह ठीक काम करता है जब is_cli() या show_404();' , क्योंकि क्योंकि आप लिख रहे क्रॉन्टाब में एक http अनुरोध भेजते हैं। मान लें कि आप ग्राहक हैं, और सर्वर 10.0.1.666 है। प्रत्येक बार क्रोंटैब चल रहा है, 'क्लाइंट' एक http अनुरोध भेजता है। और सर्वर 666 अनुरोध प्राप्त करता है तो आपके द्वारा लिखे गए नियंत्रक को उत्साहित करता है। यह एक क्ली लिपि नहीं है। यदि आप http अनुरोध भेजकर ऐसा करने का आग्रह करते हैं। मैं 2 adivices (नहीं सबसे अच्छा है, लेकिन काम कर सकते हैं)

  1. , कुछ प्राप्त पैरामीटर जो केवल आप अपने नियंत्रक पैरा का प्रदर्शन शुरू http://10.0.1.666/tools/Cli_only/cron_job?running=no_one_knows_this
  2. परिवर्तन की तरह जानती हैं पैरा isnot अगर 'no_one_knows_this', बाहर निकलें है();

दूसरा, मैं दृढ़ता से सुझाव देता हूं कि आप सर्वर पर बैश चलाएं।

+0

आप इस सीआई नियंत्रक को http अनुरोध के रूप में नहीं चलाने का सुझाव कैसे देते हैं? या किसी भी अन्य तरीके से, सर्वर पर इसे चलाते हुए, यह क्या लाभ देगा? –

संबंधित मुद्दे