2015年1月28日 星期三

[踩雷回報] Laravel Quick Start

今天心血來潮想完整的照著 Laravel Quick Start 跑一次,
由於開發環境是 win7 安裝 Homestead 的過程困難重重,
先直接從 Laravel dojo 載了wagon 體驗,卻因此在設定 route 時遇到一個雷。
如上圖的設定 routes.php 後發現只連的到 '/' ,卻連不到 user ,localhost/user 總是開啟404頁面,除非直接連localhost/index.php/user 才能吃到 route 中的設定,似乎是沒啟動 pretty urls 機制,歸納一下找到的處理方式,使用 Apache 的話可以參考看看,
  1. 先去 httpd.conf 設定 AllowOverride All ,這裡是為了對目標路徑的 url 進行重寫時從.htaccess 中讀取重寫規則 ( wagon 中已預設開啟)
  2. <Directory "/var/www/laravel/public">
        AllowOverride All
    </Directory>

  3. 在public中建立 .htaccess 檔,內部描述重寫規則,以下參考 laravel 官網 install pretty urls
Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

主要是quick start 中沒有註明這段,不小心會錯過,設定好後就可以正確的導向 localhost/user 了。

2015年1月27日 星期二

[PHP 語法實測] 取得當前路徑或檔案名稱

想取得當前路徑和檔名有許多方法,
這裡針對 __DIR____FILE__basename()dirname()
幾個方法進行實測

輸出:
        D:\xampp\htdocs\phpSyntaxLab\index.php
        D:\xampp\htdocs\phpSyntaxLab
        index.php
        index
        phpSyntaxLab
        phpSyntax
        D:\xampp\htdocs\phpSyntaxLab
        D:\xampp\htdocs
        D:\xampp\htdocs

__FILE__取得當前位置的路徑以至完整檔名;

__DIR__ 則可取得除了檔名之外的完整路徑;

basename() 可用以忽略完整路徑,僅取得檔案名,
其會取得在最後一個 \ 斜線符號後方的字串,儘管其為資料夾名,而非檔名也會被擷取,
第二個參數可鍵入副檔名,如此取得結果即不包含副檔名,其作用類似於 preg_replace('/.php$/');

dirname(__FILE__) 與 __DIR__ 都會取得檔案系統中的完整路徑,
讓兩種方式各跑一百萬遍輸出:

      dirname(__FILE__) cost 0.4360249042511 seconds
      __DIR__ cost 0.088005065917969 seconds

__DIR__較dirname(__FILE)快了近五倍。

但由於dirname() 取值方式為取至最後一個斜線之前的字串,
使用dirname(dirname(__FILE__))可相當方便的取到再更上一層的路徑。

需特別注意的是, __DIR__ 只有在 php 5.3之後的版本才可使用

2015年1月25日 星期日

[PHP 語法實測] time V.S. microtime function

time 可取得自1970年1月1日00:00:00到目前時間的秒數;
microtime 也可做到同樣的事,只是其取至微秒數。
兩者回傳都是秒數,當時間需要進行加減運算時相當方便。

輸出:
            microtime:0.22268100 1422235329
            microtime(true):1422235329.2227
            time:1422235329
            time cost 0.19701099395752
            microtime cost 3.2161841392517

microtime() 會將小數點前後秒數以空白為分界切分回傳,使用前需用preg_split() 等function 切分,
microtime(true) 則僅回傳一個float值,
time() 僅回傳整數秒,
兩者的執行效率比較上,各執行1000000遍,time() 比 microtime() 快了至少 15 倍有餘,
當然在僅執行一次時這差別應該是微乎其微,看大夥需求使用囉。