$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);
2014-03-05 14:44
使用 Stream 讀取 cUrl 下載結果
使用 stream 的好處就是用多少拿多少,不會因為資料大小而占用大量的記憶體。
2011-01-25 10:14
[Shell] 依據遠端清單進行目錄同步
這個任務的狀況是:
有些新的檔案會被加入,而舊的檔案會被移除,檔案的內容基本上是不會變動的,所以可透過檔名來進行同步。
檔案下載與錯誤處理:
這裡用 curl 來處理下載的問題,並且當發生錯誤時重試三次。
清單比較:
從遠端下載檔案清單與本地端的目錄進行比對,並處理刪除跟下載的動作。
有些新的檔案會被加入,而舊的檔案會被移除,檔案的內容基本上是不會變動的,所以可透過檔名來進行同步。
檔案下載與錯誤處理:
這裡用 curl 來處理下載的問題,並且當發生錯誤時重試三次。
#!/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;
清單比較:
從遠端下載檔案清單與本地端的目錄進行比對,並處理刪除跟下載的動作。
#!/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;
2011-01-24 16:29
[Shell] 透過版本編號與遠端的 package 同步
有一個的任務是要將一個用 tar 封裝的目錄從 server 端同步到 client 上,然後有機個考量點:
建立 server 端的 package
client 端的同步處理
- 必須確保 client 永遠都讀得到資料
- 最小的資料中斷
- 最小的硬碟存取
- 必要的錯誤處理
建立 server 端的 package
#!/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
client 端的同步處理
#!/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;
2009-05-20 15:00
[PHP] 取得 URL 頁面上的 title 內容
<?php
/*
功能: 取得 URL 頁面上的 <title> 內容
參數:$_POST['url']
*/
// 設定最長執行的秒數
ini_set ("expect.timeout", 30);
set_time_limit(30);
// 檢查 URL
if(!isset($_POST['url']) || $_POST['url'] == ''){
echo "URL 錯誤";
exit;
}
/* 取得 URL 頁面資料 */
// 初始化 CURL
$ch = curl_init();
// 設定 URL
curl_setopt($ch, CURLOPT_URL, $_POST['url']);
// 讓 curl_exec() 獲取的信息以資料流的形式返回,而不是直接輸出。
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
// 在發起連接前等待的時間,如果設置為0,則不等待
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);
// 設定 CURL 最長執行的秒數
curl_setopt ($ch, CURLOPT_TIMEOUT, 30);
// 嘗試取得文件內容
$store = curl_exec ($ch);
// 檢查文件是否正確取得
if (curl_errno($ch)){
echo "無法取得 URL 資料";
//echo curl_error($ch);/*顯示錯誤訊息*/
exit;
}
// 關閉 CURL
curl_close($ch);
// 解析 HTML 的 <head> 區段
preg_match("/<head.*>(.*)<\/head>/smUi",$store, $htmlHeaders);
if(!count($htmlHeaders)){
echo "無法解析資料中的 <head> 區段";
exit;
}
// 取得 <head> 中 meta 設定的編碼格式
if(preg_match("/<meta[^>]*http-equiv[^>]*charset=(.*)(\"|')/Ui",$htmlHeaders[1], $results)){
$charset = $results[1];
}else{
$charset = "None";
}
// 取得 <title> 中的文字
if(preg_match("/<title>(.*)<\/title>/Ui",$htmlHeaders[1], $htmlTitles)){
if(!count($htmlTitles)){
echo "無法解析 <title> 的內容";
exit;
}
// 將 <title> 的文字編碼格式轉成 UTF-8
if($charset == "None"){
$title=$htmlTitles[1];
}else{
$title=iconv($charset, "UTF-8", $htmlTitles[1]);
}
echo $title;
}
分類:
cUrl,
PHP,
Regular Expression
1 回應
2009-04-29 17:22
[PHP] 線上編碼文件轉換器
這是利用 iconv 及 curl 去做線上文件編碼轉換,之前為了讓桌面行事曆能夠讀取 Google Calendar 而做的轉換器。
參考文章:
PHP程式學習筆記本(PHP.Javascript.Mysql.cakephp.Jquery.Smarty): php.curl詳解
<?php
// 設定最長執行的秒數
ini_set ("expect.timeout", 30);
set_time_limit(30);
if($_GET['url']){
// 設定原始編碼及目標編碼
$source=($_GET['source'])? $_GET['source']: 'UTF-8';
$target=($_GET['target'])? $_GET['target']: 'BIG5';
// 取得 URL
$url=$_GET['url'];
// 初始化 CURL
$ch = curl_init();
// 設定 URL
curl_setopt($ch, CURLOPT_URL, $url);
// 讓 curl_exec() 獲取的信息以資料流的形式返回,而不是直接輸出。
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
// 在發起連接前等待的時間,如果設置為0,則不等待
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);
// 設定 CURL 最長執行的秒數
curl_setopt ($ch, CURLOPT_TIMEOUT, 30);
// 嘗試取得文件內容
$store = curl_exec ($ch);
// 檢查文件是否正確取得
if (!curl_errno($ch)){
// 編碼轉換
echo iconv($source,$target, $store);
exit;
}
}
?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>線上編碼文件轉換器</title>
</head>
<body style="width:28em;margin:5% auto;text-align:center;">
<form method="get" action="">
<fieldset>
<legend>線上編碼文件轉換器</legend>
<label>URL : <input type="text" name="url" size="48" /></label>
<p>
<input type="text" name="source" size="12" value="UTF-8" />
-> 轉換至 ->
<input type="text" name="target" size="12" value="BIG5" />
</p>
<p><input type="submit" value="開始轉換"/></p>
</fieldset>
</form>
</body>
</html>
參考文章:
PHP程式學習筆記本(PHP.Javascript.Mysql.cakephp.Jquery.Smarty): php.curl詳解
訂閱:
文章 (Atom)