tag:blogger.com,1999:blog-59465307047421309702024-03-06T16:20:07.273+08:00Jax 的工作紀錄除了在整理學習上的經驗,同時也能幫助其他需要的人Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-5946530704742130970.post-52031273633087622812014-03-05T14:44:00.001+08:002014-03-05T14:44:59.489+08:00使用 Stream 讀取 cUrl 下載結果使用 stream 的好處就是用多少拿多少,不會因為資料大小而占用大量的記憶體。<br />
<br />
<pre class="php" name="code">$url = 'http://www.google.com.tw';
/* 建立接收的 Temp File Stream */
$tmpfile = tmpfile();
$curl = curl_init();
/* 指定下載的的 URL */
curl_setopt($curl, CURLOPT_URL, $url);
/* 指定存放的 File Stream */
curl_setopt($curl, CURLOPT_FILE, $tmpfile);
/* 執行並取得狀態 */
$status = curl_exec($curl);
curl_close($curl);
if(!$status){
fclose($tmpfile);
exit('error');
}
/* Temp File Stream 指標歸零 */
fseek($tmpfile, 0);
/*一次讀取一行*/
while (($line = fgets($tmpfile)) !== false) {
var_dump($line);
}
/* 關閉 Stream */
fclose($tmpfile);
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-24128424277222021552011-01-25T10:14:00.001+08:002014-03-05T14:47:09.639+08:00[Shell] 依據遠端清單進行目錄同步這個任務的狀況是:<br />
有些新的檔案會被加入,而舊的檔案會被移除,檔案的內容基本上是不會變動的,所以可透過檔名來進行同步。<br />
<br />
<br />
檔案下載與錯誤處理:<br />
這裡用 curl 來處理下載的問題,並且當發生錯誤時重試三次。<br />
<pre class="sh" name="code">#!/bin/bash
# download_file.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
LIMIT=3 # retry 3 times
LOCAL_PATH=$1
REMOTE_URL=$2
FILE_NAME=$3
while [ $LIMIT \> 0 ] ; do
#echo $REMOTE_URL/$FILE_NAME
rm -f $LOCAL_PATH/$FILE_NAME.tmp
curl -f -o $LOCAL_PATH/$FILE_NAME.tmp $REMOTE_URL/$FILE_NAME > /dev/null
if [ "$?" == "0" ]; then
mv -f $LOCAL_PATH/$FILE_NAME.tmp $LOCAL_PATH/$FILE_NAME
exit 0;
fi
LIMIT=$(($LIMIT-1))
done
exit 1;
</pre><br />
<br />
清單比較:<br />
從遠端下載檔案清單與本地端的目錄進行比對,並處理刪除跟下載的動作。<br />
<pre class="sh" name="code">#!/bin/bash
# folder_sync.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
REMOTE_URL=http://remote_site/pics
REMOTE_LIST_URL=http://remote_site/pics/file.list
LOCAL_PATH=/var/www/pics
# get remote list
REMOTE_LIST=$(curl -f $REMOTE_LIST_URL |tr -d '\r')
if [ "$?" != "0" ]; then exit 1; fi
# get local list
cd $LOCAL_PATH
LOCAL_LIST=$(ls -1)
if [ "$?" != "0" ]; then
LOCAL_LIST=""
fi
# Check loacl file exists in the list
for ITEM in $LOCAL_LIST ; do
echo "$REMOTE_LIST" |grep "^$ITEM\$" > /dev/null
if [ "$?" != "0" ]; then
# delete old file
rm -f $ITEM &> /dev/null
fi
done
# Check remote file exists in the list
for ITEM in $REMOTE_LIST ; do
echo "$LOCAL_LIST" |grep "^$ITEM\$" > /dev/null
if [ "$?" != "0" ]; then
# download new file
download_file.sh $LOCAL_PATH $REMOTE_URL $ITEM &> /dev/null
fi
done
exit 0;
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-28547533967342641542011-01-24T16:29:00.003+08:002014-03-05T14:47:09.642+08:00[Shell] 透過版本編號與遠端的 package 同步有一個的任務是要將一個用 tar 封裝的目錄從 server 端同步到 client 上,然後有機個考量點:<br />
<ul><li>必須確保 client 永遠都讀得到資料</li>
<li>最小的資料中斷</li>
<li>最小的硬碟存取</li>
<li>必要的錯誤處理</li>
</ul><br />
<br />
建立 server 端的 package<br />
<pre class="sh" name="code">#!/bin/bash
# package_build.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
PROJECT_NAME=metadata
SOURCE_PATH=/var/projects
PORTING_PATH=/var/www
PACKAGE_NAME=$PROJECT_NAME.$(/bin/date +%s)
OLD_PACKAGE=$(find $PORTING_PATH -name "$PROJECT_NAME.*.tgz")
# Create Package
cd $SOURCE_PATH/$PROJECT_NAME
tar -zcf $PORTING_PATH/$PACKAGE_NAME.tgz ./*
# Update version number to release
echo $PACKAGE_NAME > $PORTING_PATH/$PROJECT_NAME.latest
# remove old version
#rm -f $OLD_PACKAGE
echo -e "<< $PACKAGE_NAME package complete >>"
exit 0
</pre><br />
<br />
client 端的同步處理<br />
<pre class="sh" name="code">#!/bin/bash
# package_sync.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
REMOTE_URL=http://remote_site/
TARGET_PATH=/var/www
PROJECT_NAME=metadata
PROJECT_PATH=$TARGET_PATH/$PROJECT_NAME
# get now version
NOW_VERSION=$PROJECT_NAME.0000000000
if [ -h "$PROJECT_PATH" ] && [ -d "$PROJECT_PATH" ]; then
NOW_VERSION=$(readlink $PROJECT_PATH)
fi
echo -e 'NOW_VERSION' $NOW_VERSION
# get remote version
REMOTE_VERSION=$(curl -f $REMOTE_URL/$PROJECT_NAME.latest |tr -d '\r')
if [ "j$?" != "j0" ]; then exit 1; fi
echo -e 'REMOTE_VERSION' $REMOTE_VERSION
# deff version, not deff goto exit.
if [ ! "$NOW_VERSION" \< "$REMOTE_VERSION" ]; then exit 0; fi
echo -e "Update package"
# create now version folder
mkdir -p $TARGET_PATH/$REMOTE_VERSION
if [ "$?" != "0" ]; then exit 1; fi
# Download Package
cd $TARGET_PATH/$REMOTE_VERSION
curl -o $PROJECT_NAME.tgz $REMOTE_URL/$REMOTE_VERSION.tgz
if [ "$?" != "0" ]; then exit 1; fi
# Decompression Package
tar -zxf $PROJECT_NAME.tgz
rm -f $PROJECT_NAME.tgz
# Update version link
cd $TARGET_PATH
ln -sfn $REMOTE_VERSION $PROJECT_NAME
# remove old version
rm -rf $NOW_VERSION
exit 0;
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-8603290914937517402009-05-20T15:00:00.004+08:002014-03-05T14:47:09.648+08:00[PHP] 取得 URL 頁面上的 title 內容<pre class="php" name="code"><br /><?php<br />/*<br />功能: 取得 URL 頁面上的 <title> 內容 <br /><br />參數:$_POST['url']<br />*/<br /><br />// 設定最長執行的秒數<br />ini_set ("expect.timeout", 30);<br />set_time_limit(30);<br /><br />// 檢查 URL<br />if(!isset($_POST['url']) || $_POST['url'] == ''){ <br /> echo "URL 錯誤";<br /> exit;<br />}<br /><br /><br />/* 取得 URL 頁面資料 */<br />// 初始化 CURL<br />$ch = curl_init();<br /><br />// 設定 URL <br />curl_setopt($ch, CURLOPT_URL, $_POST['url']); <br />// 讓 curl_exec() 獲取的信息以資料流的形式返回,而不是直接輸出。<br />curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);<br />// 在發起連接前等待的時間,如果設置為0,則不等待<br />curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);<br />// 設定 CURL 最長執行的秒數<br />curl_setopt ($ch, CURLOPT_TIMEOUT, 30);<br /><br />// 嘗試取得文件內容<br />$store = curl_exec ($ch);<br /><br /><br />// 檢查文件是否正確取得<br />if (curl_errno($ch)){<br /> echo "無法取得 URL 資料";<br /> //echo curl_error($ch);/*顯示錯誤訊息*/<br /> exit;<br />}<br /><br />// 關閉 CURL<br />curl_close($ch);<br /><br /><br />// 解析 HTML 的 <head> 區段<br />preg_match("/<head.*>(.*)<\/head>/smUi",$store, $htmlHeaders);<br />if(!count($htmlHeaders)){<br /> echo "無法解析資料中的 <head> 區段";<br /> exit;<br />} <br /> <br />// 取得 <head> 中 meta 設定的編碼格式<br />if(preg_match("/<meta[^>]*http-equiv[^>]*charset=(.*)(\"|')/Ui",$htmlHeaders[1], $results)){<br /> $charset = $results[1];<br />}else{ <br /> $charset = "None";<br />}<br /><br />// 取得 <title> 中的文字 <br />if(preg_match("/<title>(.*)<\/title>/Ui",$htmlHeaders[1], $htmlTitles)){<br /> if(!count($htmlTitles)){<br /> echo "無法解析 <title> 的內容";<br /> exit;<br /> }<br /> <br /> // 將 <title> 的文字編碼格式轉成 UTF-8<br /> if($charset == "None"){<br /> $title=$htmlTitles[1];<br /> }else{<br /> $title=iconv($charset, "UTF-8", $htmlTitles[1]);<br /> }<br /> echo $title;<br />}<br /><br /></pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com1tag:blogger.com,1999:blog-5946530704742130970.post-68247463223482269072009-04-29T17:22:00.002+08:002014-03-05T14:47:09.645+08:00[PHP] 線上編碼文件轉換器這是利用 iconv 及 curl 去做線上文件編碼轉換,之前為了讓桌面行事曆能夠讀取 Google Calendar 而做的轉換器。<br /><br /><pre class="php" name="code"><br /><?php <br />// 設定最長執行的秒數<br />ini_set ("expect.timeout", 30);<br />set_time_limit(30);<br /><br />if($_GET['url']){<br /> // 設定原始編碼及目標編碼<br /> $source=($_GET['source'])? $_GET['source']: 'UTF-8';<br /> $target=($_GET['target'])? $_GET['target']: 'BIG5';<br /> <br /> // 取得 URL<br /> $url=$_GET['url'];<br /><br /> // 初始化 CURL<br /> $ch = curl_init();<br /> <br /> // 設定 URL <br /> curl_setopt($ch, CURLOPT_URL, $url); <br /> // 讓 curl_exec() 獲取的信息以資料流的形式返回,而不是直接輸出。<br /> curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);<br /> // 在發起連接前等待的時間,如果設置為0,則不等待<br /> curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);<br /> // 設定 CURL 最長執行的秒數<br /> curl_setopt ($ch, CURLOPT_TIMEOUT, 30);<br /><br /> // 嘗試取得文件內容<br /> $store = curl_exec ($ch);<br /><br /> // 檢查文件是否正確取得<br /> if (!curl_errno($ch)){<br /> // 編碼轉換<br /> echo iconv($source,$target, $store);<br /> exit;<br /> }<br />}<br />?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><br /><html><br /><head><br /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><br /> <title>線上編碼文件轉換器</title><br /></head><br /><body style="width:28em;margin:5% auto;text-align:center;"><br /> <form method="get" action=""><br /> <fieldset><br /> <legend>線上編碼文件轉換器</legend><br /> <label>URL : <input type="text" name="url" size="48" /></label><br /> <p><br /> <input type="text" name="source" size="12" value="UTF-8" /> <br /> -&gt; 轉換至 -&gt;<br /> <input type="text" name="target" size="12" value="BIG5" /><br /> </p><br /> <p><input type="submit" value="開始轉換"/></p><br /> </fieldset><br /> </form><br /></body><br /></html><br /><br /></pre><br /><br />參考文章:<br /><a href="http://calos-tw.blogspot.com/2009/04/phpcurl.html">PHP程式學習筆記本(PHP.Javascript.Mysql.cakephp.Jquery.Smarty): php.curl詳解</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0