blog.Ring.idv.tw

PHP

取得MediaWiki Editable Text

這個小範例主要是用來取得目前最多人用的Wiki架站軟體「MediaWiki」的編輯文字~

筆者使用「HttpClient - a PHP Web Client Class」來當作我的HttpRequest Library,內部程式是直接開啟Socket去連線的~ 且這樣就毋須裝上「cURL」or「Zend Framework」等套件了~ 小巧又好用~ ^^

這裡就拿「Wikipedia - Hadoop」的資料來測試~ 其實程式碼相當精簡~

<?
require_once "HttpClient.php";

$body = HttpClient::quickGet('http://en.wikipedia.org/w/index.php?title=Hadoop&action=edit');
$regex = '/cols=\'80\' >(.*)<\/textarea>/Us';
preg_match($regex,$body,$match);
echo $match[1];
?>

2008-04-24 00:43:49 | Add Comment

Installing MySQL & Apache2 & PHP & PDO on Debian 4.0

來練習一下該如何在Debian Linux下建立一個LAMP的環境~

安裝MySQL

「libmysqlclient15-dev」要編譯「PDO_MYSQL」時會用到,所以就一併安裝

apt-get install mysql-server libmysqlclient15-dev

裝完成功後~ 記得為你的MySQL root帳號設置一下密碼,假設密碼為「1234」:

mysqladmin -u root password 1234

安裝Apache2

apt-get install apache2

裝好後修改一下設定~

vi /etc/apache2/sites-available/default

將「RedirectMatch ^/$ /apache2-default/」這一行註解起來,如下所示:

# RedirectMatch ^/$ /apache2-default/

讓「/」根目錄不要重導到「/var/www/apache2-default」下

安裝PHP5

「php5-dev」有包含「phpize」這個指令~ 待會要編譯PHP extension會用到~ 所以也一併安裝

apt-get install php5 php5-dev

這時候你可以在「/var/www/」下建立一個名為「index.php」,內容如下:

<?
phpinfo();
?>

然後打開你的瀏覽器,輸入「http://localhost/」就可以看到你的PHP相關組態資訊了~

安裝PDO

首先先下載PDO、PDO-MySQL~

wget http://pecl.php.net/get/PDO-1.0.3.tgz
wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz

然後解壓縮兩個檔案~

tar zxvf PDO-1.0.3.tgz
tar zxvf PDO_MYSQL-1.0.2.tgz

先安裝PDO

cd PDO-1.0.3
phpize
./configure
make
make install

在安裝PDO_MYSQL,要先修改「config.m4」這個檔案,然後刪除下述四行,在122行。

ifdef([PHP_ADD_EXTENSION_DEP],
[
  PHP_ADD_EXTENSION_DEP(pdo_mysql, pdo)
])

安裝PDO_MYSQL

cd PDO_MYSQL-1.0.2
phpize
./configure
make
make install

確認PDO有設置成功

vi /etc/php5/conf.d/pdo.ini

內容應該包含下述兩行:

extension=pdo.so
extension=pdo_mysql.so

測試環境

先重新啟動你的「apache2」

/etc/init.d/apache2 restart

然後在「/var/www/」之下,建立一個「test.php」,程式如下:

<?php
set_exception_handler('exception_handler');

$user = 'root';
$pass = '1234';
$db = new PDO('mysql:host=localhost;dbname=mysql', $user, $pass);

foreach ($db->query('SELECT * from user') as $row) {
    print_r($row);
}
$db = null;
function exception_handler($e) {
    die($e->getMessage() . "\n");
}
?>

成功的話應該就會看見一大堆陣列資訊了 ^^

參考資源

【PHP】DebianにPDOをインストール

在 Debian 安裝 Apache + MySQL + PHP

【安裝筆記】Apache, MySQL, PHP, Subversion Installation on Debian Etch

Debian下Apache2+Mysql5+Php5的安装配置

2008-04-19 00:38:05 | Comments (7)

PHP Question - ($a-- +1)

剛剛在小海格友的Blog看到一篇文章「PHP Question」,他的問題如下所述:

<?php  
$a = 1;  
$a = $a-- +1;  
echo $a;  
?> 

這時候 $a 會等於多少?

其實這種問題只要針對內部的堆疊運作去Run一次就可以得到詳解了~

不過我不曉得PHP有沒有「類似」javap這樣的工具,或是有辦法可以讓我們看到PHP內部一個個opcode處理的方式?有的話分享一下唄~ 感恩呢 ^^

所以我去下載了「php-5.2.5」原始碼~ 本來想打算從PHP的原始碼中來找答案~

可是我看了看~ 總覺得不曉得要花費多少時間~ 而且這樣實在太沒效率了~ 除非你想研究則不在此限~

不過也意外發現~ PHP的原始程式還是用了「Virtual Machine」這樣的字眼 ^^~

P.S. PHP全部的opcode都定義在「Zend/zend_vm_opcodes.h」 <== 檔名有「vm」

Java解釋

這裡我打算換個角度來解釋~ 乾脆用Java來模擬一樣的問題~ 程式如下:

public class Plus
{
	public static void main(String arg[])
	{
		int a = 1;  
		a = a-- + 1;  
		System.out.println(a);
	}
}

接著我用「javap」來反組譯一下~ 看看operand stack是怎麼Run的~

我們就直接來看上圖所用黃色框起來的opcode~

0: iconst_1 #將int constant「1」推入到Operand Stack。

1: istore_1 #將Operand Stack的「1」存到Local Variable[1]的位置(所以到這邊已經完成了「int a = 1;」)。

2: iload_1 #將剛剛那個Local Variable[1]的整數值再載入到Operand Stack。

3: iinc 1, -1 #將目前Local Variable[1]的值「減1」。

6: iconst_1 #將int constant「1」推入到Operand Stack (所以現在Operand Stack有兩個都為「1」的值)。

7: iadd #將Operand Stack前兩個整數值相加後再推入到Operand Stack (所以目前Operand Stack只有一個「2」的整數值)。

8: istore_1 #將Operand Stack「2」存到Local Variable[1]的位置。

結果出來了~ 重點就在於「3: iinc 1, -1」是減掉Local Variable[1]的值~ 而不是減掉Operand Stack中待會要進行「iadd」相加的值~,所以這個範例會印出的值當然就是「2」嚕~ ^^

呃... 又2點多了~ 來去睡~ 這個三月挺忙的 ^^a

2008-03-01 02:32:10 | Comments (2)

PHP 縮圖製作(Image Thumbnail) - GD Library

最近剛好需要用到一個縮圖技巧~ 所以我Google了一下~ 想找到PHP製作縮圖的方式~

而Google出來的結果發現到~ 使用官方所採用的GD libraryImageMagick 兩者較常被使用~

這裡我就直接用官方所採用的GD library來做~ 不過「聽說ImageMagick效率較好~ 有沒有人有相關的建議呢?分享一下唄~

PHP 縮圖製作(Image Thumbnail)

HTML - 上傳頁面

<form action="ImageHandler.php" method="post" enctype="multipart/form-data">
<input type="file" name="uploadfile"/>
<input type="submit"/>

ImageHandler.php - 縮圖處理細節封裝在ImageResize.php

下述程式是以縮圖後的尺寸為「100」當基礎,所以寬度和高度的尺寸會自動地照比例縮圖~ 如果您想要客製化更多的功能~ 可以自行擴充或改寫ImageResize.php

<?php
require_once 'ImageResize.php';

$ir = new ImageResize();

$ir->readImage($_FILES['uploadfile']['tmp_name']);

$ir->thumbnailImage(100);

$ir->writeImage($_FILES['uploadfile']['name']);

$ir->destory();
?>

ImageResize.php - 處理縮圖的ImageResize Class

<?php
/**
 * Date: 2008/02/28
 * Shen(http://blog.ring.idv.tw)
 */
class ImageResize
{
	private $src_image;
	private $src_width;
	private $src_height;
	private $dest_image;
	private $dest_width;
	private $dest_height;

	function __construct(){}
	public function readImage($imgpath)
	{
		$this->src_image = imagecreatefromjpeg($imgpath);
		$size = getimagesize($imgpath);	
		$this->src_width = $size[0];
		$this->src_height = $size[1];
	}
	public function thumbnailImage($size)
	{
		if($this->src_width > $this->src_height)
		{
			$this->dest_width = $size;
			$this->dest_height = ($this->src_height/$this->src_width)*$size;
		}else{
			$this->dest_height = $size;
			$this->dest_width = ($this->src_width/$this->src_height)*$size;
		}

		$this->dest_image = imagecreatetruecolor($this->dest_width,$this->dest_height);
		imagecopyresampled($this->dest_image,$this->src_image,0,0,0,0,$this->dest_width,$this->dest_height,$this->src_width,$this->src_height);
	}
	public function writeImage($imgpath)
	{
		imagejpeg($this->dest_image,$imgpath,100);
	}
	public function destory()
	{
		imagedestroy($this->src_image);
		imagedestroy($this->dest_image);
	}
}
?>

參考資源

PHP: Image - Manual

How to Resize an Image Using PHP - Image Resizing Script

2008-02-28 21:54:37 | Comments (11)

IP地理位置解析原理

上圖是根據我部落格透過「whos.amung.us」所記錄的一些參觀者的來源分佈~ 從圖中可以知道參觀者來自於各個不同的國家~

還有像是「用Zend_Http做一個IP地理位址查詢」這樣諸如此類的應用~ 技術上是如何達成的呢?

我們可以透過程式來取得Client's IP,但如何能知道此IP是隸屬於哪個國家呢?

這時就需要透過IP<->Country的對應表來實現~

找了一下~ 發現有兩個好的資源可以下載這類的對應表:

ip2nation

The IP-to-Country Handbook

這裡我拿「The IP-to-Country Handbook」來解析一下:

IP-to-Country解析

首先請先下載「latest IP-to-Country Database」這一份對應表~

它所呈現的格式如下所示:

"0033996344","0033996351","GB","GBR","UNITED KINGDOM"
"0050331648","0083886079","US","USA","UNITED STATES"
"0094585424","0094585439","SE","SWE","SWEDEN"
...

欄位與欄位之間用「,」來隔開~ 它們依序分別為:IP位址起始,IP位址結束,2字元國碼,3字元國碼,國家名稱

這裡它將用「.」區隔的IP位址改成用長整數來表示~

也就是說~ 我們必須將IP位址先轉換成長整數,然後比較IP位址起始,IP位址結束的範圍即可得出結果~

轉換公式:

IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D

舉個例子:

IP位址:64.233.189.99

轉換:

X = 64 x (256*256*256) + 233 x (256*256) + 189 x 256 + 99
X = 64 x 16777216 + 233 x 65536 + 189 x 256 + 99
X = 1089060195

所以從對應表找出「1089060195」介於IP位址起始值IP位址結束值即可得出解答!!

P.S. PHP程式可以善加利用「ip2long()」、「long2ip()」兩函式來轉換

2008-02-15 16:40:12 | Add Comment

Next Posts~:::~Previous Posts
Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment