顯示具有 cUrl 標籤的文章。 顯示所有文章
顯示具有 cUrl 標籤的文章。 顯示所有文章
2014-03-05 14:44

使用 Stream 讀取 cUrl 下載結果

使用 stream 的好處就是用多少拿多少,不會因為資料大小而占用大量的記憶體。

$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);
2011-01-25 10:14

[Shell] 依據遠端清單進行目錄同步

這個任務的狀況是:
有些新的檔案會被加入,而舊的檔案會被移除,檔案的內容基本上是不會變動的,所以可透過檔名來進行同步。


檔案下載與錯誤處理:
這裡用 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 上,然後有機個考量點:
  • 必須確保 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;
}

2009-04-29 17:22

[PHP] 線上編碼文件轉換器

這是利用 iconv 及 curl 去做線上文件編碼轉換,之前為了讓桌面行事曆能夠讀取 Google Calendar 而做的轉換器。


<?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" />
-&gt; 轉換至 -&gt;
<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詳解