2013年3月13日 星期三

GAE 的 Cron Job

網路上有許多提供免費 PHP 主機的公司, 提供至少 1G 以上的程式空間, 所以其實一些中小型專案都可以利用這些免費的東東, 雖然免費方案不保證系統穩定運轉, 但只要定期備份資料庫就好了. 這裡 http://www.free-webhosts.com/reviews/removed.php  就有一狗票的免費主機可申請, 我最常用的是 000webhost1freehostingx90x.net 這三家, 因為它們都有 Cpanel, 完全用 web 方式傳檔, 甚至要直接在檔案管理介面上直接 coding 也沒問題. 但是有一點很煩惱, 這些免費主機通常會統計每個月的流量, 如果申請後一直沒用, 或者沒有公開, 使得到訪流量太低的話, 帳號可能會被凍結 (通常一個月至少要有 30 個 visits 以上較保險), 我申請的五六個網站每個月都會收到停權信, 這時趕快申請復權即可, 但若太久沒收信, 超過時限可就會被註銷帳號了.
為了避免這種困擾, 可以用 Google App Engine 的 Cron Job 來定期拜訪這些網站, 機械式地製造流量來避免. GAE 的 Cron Job 可是非常穩定與準時的喲 !
首先, 先寫個簡單的 PHP, 例如 hello.php :


hello.php


<!DOCTYPE html>
<?php
echo "hello";
?>


把 hello.php 上傳到目前閒置中的免費 PHP 主機上. 例如我的 mybidbot 網站.
然後在 GAE 上新增一個應用程式, 修改其中的 cron.yaml 如下 :


cron.yaml

cron:
- description: mybidrobot.allalla.com job
  url: /hello1
  schedule: every 32 minutes
  timezone: Asia/Taipei

其中重要的是 url 與 schedule 設定, url 設定為自動呼叫在 main.py 中的 URL 要求處理程式 hello1, 而 schedule 是每 32 分鐘呼叫一次, GAE 最低只能設 1 分鐘一次. 注意, 每一分鐘是 every 1 minutes, 每一小時是 every 1 hours, 每一天則是 every 1 days, 要用複數 .
最後是修改 main.py 如下 :


main.py

# -*- coding: utf-8 -*-
import sys
import webapp2
from google.appengine.api import urlfetch
import urllib

class hello1(webapp2.RequestHandler):
    def get(self):
        url="http://mybidrobot.allalla.com/hello.php"
        result=urlfetch.fetch(url)
        if result.status_code == 200:
            self.response.write(result.content)
        else:
            out="urlfetch failed"
            self.response.write(out)

class MainPage(webapp2.RequestHandler):
  def get(self):
      self.response.headers['Content-Type'] = 'text/plain'
      self.response.write('Hello, webapp2 World!')

app = webapp2.WSGIApplication([('/', MainPage),
                               ('/hello1', hello1)
                              ],
                              debug=True)

如果有多個網站, 就在 ('/hello1', hello1) 後面加一逗號, 再複製一項例如 ('/hello2', hello2), 複製 hello1 的 class 改為 hello2, 並修改其中的 url 網址即可, 這樣 GAE 就會週期性拜訪這些網站下的 hello.php 製造流量了, 好像 heartbeat 一樣. GAE Cron job 詳參 :
https://developers.google.com/appengine/docs/python/config/cron?hl=zh-tw

如果要更新 cron 服務設定, 只要把 cron.yaml 修改好, 然後打開 DOS 視窗, 切換到應用程式目錄上一層, 例如 gaebuilder 執行下列指令即可更新 cron 服務設定 :

appcfg.py update_cron gaebuilder 


更新完成後, 若要確認 cron 內容是否已修改, 可用下列指令顯示目前所設定之排程服務,  到應用程式目錄上一層執行 :

appcfg.py cron_info gaebuilder  

如果要刪除全部 cron 排程設定 (即停止 cron 運作), 只要留下 cron.yaml 裡的第一行 "cron:" 其餘刪除, 再以上述指令更新 cron 服務設定即可.  

注意喔, GAE 對 cron 服務是有限制的 :
(1). 最短執行週期為 1 分鐘
(2). 一個應用服務最多可設定執行 20 個 URL (只能透過 http/https 協定).





沒有留言:

張貼留言