使用 Codeigniter 的 Pagination 且帶入不定長度查詢參數的方法

在官方的Pagination Class 中, 用 page 的參數來控制本頁目前的起始行數。但範例裡面使用的方法如下:

</p>
<p>$this-&gt;load-&gt;library('pagination');</p>
<p>$config['base_url'] = 'http://example.com/index.php/test/page/';<br />
$config['total_rows'] = 200;<br />
$config['per_page'] = 20;</p>
<p>$this-&gt;pagination-&gt;initialize($config);<br />

所以原始的方法所產生的 url 就是 http://example.com/index.php/test/page/{row number} 這種格式。在參數是固定長度下,你可以輕易的知道在第幾個位置是分頁的依據,即可以使用 $config['uri_segment'] 來指定位置。

但如果參數為不固定數量,哪怎麼辦?使用 uri_segment 就沒有作用了,因為你也不知道第幾個位置是起始行數,而且起始行數只會加在 url 的最後面。

下面提供一個方法可以 override 掉原先的目前所抓取的起始行數的方法。

<br />
$this-&gt;load-&gt;library('pagination');</p>
<p>// 中間可以加很多的東西,但 page 一定要放在最後面<br />
$config['base_url'] = 'http://example.com/index.php/test/'.blalbala.'/page/';<br />
$config['total_rows'] = 200;<br />
$config['per_page'] = 20;<br />
// 新增下面的程式。<br />
$config['uri_segment'] = 0; // 不指定 row 的 url 位置<br />
$q = $this-&gt;uri-&gt;uri_to_assoc(3); // 把目前的參數轉成array<br />
$config['cur_page'] = $q['page']; // override 目前的 row</p>
<p>$this-&gt;pagination-&gt;initialize($config);</p>
<p>echo $this-&gt;pagination-&gt;create_links();

這樣你的參數的長度就不需要固定了。這對於帶入參數的 search ,或是 list 的頁面,在使用上較為方便,也不用作什麼 dirty hack。

PHP 5.3 已經 deprecate zend_get_parameters_ex

這幾天在把一個程式作 PHP 5.2 轉換到 PHP 5.3 的環境下,發現以前有一個 zend_get_parameters_ex 已經被 deprecated 了。

Example:


zend_get_parameters_ex( 1 , &arg1 )

簡單一點的改法就是把他改使用 zend_parse_parameters 這個 method 。

Example :


zend_parse_parameters(  ZEND_NUM_ARGS() TSRMLS_CC , "sz" , &arg1, &arg1_len, &arg2)

這個 function 比較方便,也可以不用把 zval 轉成 c 所需要的型態,可以直接放入原有的參數型態,像使用 char or long 一些原生參數就方便多了。

Old Method Example:


zval **arg1;
std::string str;
zend_get_parameters_ex( 1 , &arg1 ) ;
convert_to_string_ex( arg1 );
str = Z_STRVAL_PP( arg1 );

New Method Example:


char *arg1;
int arg1_len;
std::string str;
zend_parse_parameters(  ZEND_NUM_ARGS() TSRMLS_CC , "s" , &arg1, &arg1_len);
str = string(arg1);

java & php 的 timestamp 為不同單位

一般以來,我以為 timestamp 應該是要從 1970 年零點零分零秒開始,至目前時刻所經過的「秒」數,才算是 timestamp 。不過後來查了一下 java 的 timestamp 的說明,他是從 1970 年零點零分零秒開始到現在的「微秒」數。所以二者之間相差了 1000 倍。

Java 的 timestamp的說明如下:
long getTime()
Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT represented by this Timestamp object.

PHP 的 timestamp 說明如下:
int time ( void )
Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).

所以如果 php & java 要作 web service 的服務的話,記得要處理這部份的轉換。

Java 部份的程式碼:

import java.util.Calendar;
class Time
{
public static void  main(String arg[]) {
Calendar cal = Calendar.getInstance();
System.out.println(cal.getTime().getTime());
}
}

結果如下:

whatup@whatup:/tmp$ java Time
1257688227061

PHP 部份的程式碼:

 echo time();

結果如下:

whatup@whatup:/tmp$ php time.php
1257688308

利用 curl 平行抓取多個網頁

如果一次要抓多個網頁,如果使用一個一個 curl 慢慢抓的話,實在是太慢了。假設一個網頁要 0.3 sec 的話,十個網頁需要抓時就要 3 sec 了。利用這個 curl 的 mutli handle 功能,可以同時抓取 N 個網頁,這樣抓取網頁速度會有明顯的提昇。

其實也可以利用這個方法,來試試自已的網頁的存取速度怎麼樣。不過如果一次開 50 個以上,感覺抓取速度會受到影響。所以還是別同時抓取太多網頁比較好。

範例程式碼如下:

 0);

foreach($curl_obs as $curl_ob)
{
  $content = curl_multi_getcontent($curl_ob);
  var_dump(strlen($content));
}
foreach($curl_obs as $curl_ob)
{
  curl_multi_remove_handle($mh, $curl_ob);
}
curl_multi_close($mh);
?&gt;

執行結果:

whatup@whatup:/tmp$ php curl_multi.php
int(222)
int(9490)