Facebook OAuth v3.1 臉書登入 – 使用 PHP SDK

流程

  1. 下載 PHP SDK php-graph-sdk (v5)
  2. 將下載的 php-graph-sdk-5.x.zip 檔內的 src\Facebook 解壓縮到網站內
  3. 準備兩個網站路徑:登入、OAuth
  4. https://developers.facebook.com/apps 選擇臉書登入 app
    1. 設定 → 進階:升級 API 版本到 v3.1

    2. 產品 → 設定:將預計的 OAuth 路徑填入 有效的 OAuth 重新導向 URI
  5. 準備產生臉書登入連結及處理 OAuth 資訊到取得臉書個人資料 id, name, email

PHP 程式碼

這裡只列出 Facebook OAuth class 的程式碼,前面還有一個 index.php 處理網站入口,例如後面說的 session 錯誤就是寫在 index.php 內

$UserInfo 如此即可得到該登入使用者在 Facebook 的基本資料 id, name, email

無法載入網址: 這個網址的網域未包含在應用程式的網域中。若要載入這個網址,請在應用程式設定的「應用程式網域」欄位中新增應用程式的所有的網域及子網域。

請使用 Facebook 提供 SDK ,注意流程即可避免此問題

Facebook SDK returned an error: Cross-site request forgery validation failed. Required param “state” missing from persistent data.

PHP 必須開啟 session_start();

為什麼 Facebook 使用 PHP 不是使用 Javascript ?

因為 Facebook 的 js 寫的很爛只能跑在「較新版」的 Chrome 例如 v62 ,而 Google 可以跑在 Chrome v44 所以使用 PHP 沒有 js 相容性問題

在 Windows 上 使用 PHP PDO 連接 SQL Server 2008

 

安裝驅動程式 Microsoft Driver

在此使用了 xampp PHP 5.6 版本,因此需要 3.2 的 sqlsrv driver,以及 ODBC Driver

php.ini

將 sqlsrv driver 解壓縮安裝至 c:\xampp\php\ext 內,修改 php.ini

使用 php -mphpinfo() 檢查是否成功載入 SQL Server DLL

PHP 程式範例

 

rowCount() 的坑

SQL Server 沒有回傳最後影響資料數的功能,只能實際去 fetch 讀取後計算列數來達到相同功能需求

PHP 單向加密,會員資料庫密碼學

當網站需要會員機制時,除了會員名稱(姓名)、帳號外,當然最重要的就是密碼。 在此不討論那些腦殘的明文密碼http://plainpass.com/ 密碼加密的原則有

  1. 單向加密
  2. 可以比對正確與否

一、單向加密:也就是將密碼加密後,從加密資訊無法還原或得知原始密碼字串。這是後續要討論的所以先說明雙向編碼。 雙向編碼就是可還原原始資料,例如 base64

至於單向加密可以使用 md5() 或是 sha1 ,例如

  • md5() 單向「固定」加密,字元長度 32
  • sha1() 單向「固定」加密,字元長度 40

什麼是固定加密?顧名思義就是每次加密的結果是一樣的,也就是如此的特性才可以拿來當作密碼比對。

變動的加密字串

那有變動加密嗎?在 PHP 裡也是有的,可以使用 crypt()

產生加密,以 sha256 為例

當下產生的加密字串為

使用 uniqid() 的緣故,所以重新整理每次產生的字串皆不同,如此即可防止兩個相同的密碼被輕易破解

查核密碼時,因為字串變動的緣故無法單純的使用字串比對的方式,還是需要使用 crypt() function 來檢查

使用 PHP 計算 WGS84 座標兩點之間的距離

參考

實際測試

從 22.9957173, 120.1746395 到 22.9961966, 120.1747138 的距離,Google Map 測量為 54 公尺

使用 PHP 程式

結果也是 54 ,所以此程式計算為正確距離

 

使用 Workerman 開發 WebSocket 應用

WebSocket 是什麼

Workerman 是什麼

從 putty 退出背景執行也不終止

 

實際使用的範例

 

CentOS7 開啟防火牆

睡一覺起來有關資料庫應用不正常問題

workerman 是一個常駐程式,說白就是一個無限迴圈的程式。MySQL 有設計一個 Wait Timeout 的機制,預設是 28800 秒 (8 小時),因為在程式初期測試時因為不可能閒置到 8 小時,而且只要一使用時間就會重新計算,所以大部分發現的時機都是睡一覺隔天使用才發現資料庫的功能都已經失效

顯示處理程序列表

修改 wait_timeout

編輯 /etc/my.cnf

重新啟動 MySQL

正確的起始

如果按照官網建議,將資料庫連接的物件放在 onWorkerStart 內,就表示從 php start 之後就開始 wait timeout 計時

如此一來設定多長都不夠,短當然就不行。

官網及網路上的討論是如果逾時就跑一個重新建立的功能,Hoyo 測試過,慧根不夠不是很順利,所以 Hoyo 的解決方案是:在使用者進入 WebSocket 頁面,才啟動 MySQL PDO 物件,如此一來設定一個合理的長度就足夠,例如 600 秒。

因為不可能進入 WebSocket 應用,600 秒都不進行資料庫操作

根據應用都有一個加入房間的步驟,所以就將資料庫物件在這個步驟才建立。

PHPExcel

PHPExcel

使用 PHP 處理 Excel 格式檔案

讀取 Excel 檔案

產生 Excel

儲存格格式 PHPExcel_Style_NumberFormat

範例 2

Fatal error: Allowed memory size

在寫入大量資料時,出現了 Fatal error: Allowed memory size 的錯誤

無效方案

指定欄位格式

要注意 setCellValue 修改成 setCellValueExplicit

Fatal error: Class ‘XMLWriter’ not found

補一個 php-xml 就好了