顯示具有 PHP 標籤的文章。 顯示所有文章
顯示具有 PHP 標籤的文章。 顯示所有文章

curl (60) peer’s certificate issuer is not recognized.

更新 SSL 後 CURL 失效

1. 將新的 .crt 拷貝至 /etc/pki/ca-trust/source/anchors

2. 執行 update-ca-trust extract

3. 測試 curl 是否可以重新讀取


ref: 

https://ep.gnt.md/index.php/curl-60-peers-certificate-issuer-is-not-recognized/

CentOS7 Sendmail test send email


# Install sendmail sendmail-cf m4
yum install sendmail sendmail-cf m4

# edit local host name
vi /etc/mail/local-host-names
xxx.com

# edit sendmail.mc
vi /etc/mail/sendmail.mc

#change 127.0.0.1 to 0.0.0.0
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl

# change sendmail setting
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

# setting relay
vi /etc/mail/access
Connect:xxx.com RELAY

# hash database
makemap hash access < access

# restart sendmail
systemctl restart sendmail

# test php send mail
php -a
mail('user@receiver.com', "Test email", "Test email from the Internet", null, "-f user@sender.com");

Google Drive API 重新授權

1. 移除 json
2. 使手 CLI 取得網址,再取得 code 重新授權

CentOS 7 Systemd PHP


CentOS 7 Systemd 預設會打開 PrivateTmp 需要將它關掉才能與其他服務共用 /tmp

Close Systemd PHP Private Tmp
/usr/lib/systemd/system/php-fpm.service
PrivateTmp=false

Save reload daemon
systemctl daemon-reload

Restart php-fpm
systemctl restart php-fpm.service

PHP upgrade always breaks session folder permissions

PHP 升級後都會自動改成 session owner 回原本設定,
網路建議是為 owner 另建子資料夾對應, 下次就不會被更動.

user = nginx

; Set session path to a directory owned by process user
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/nginx/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/nginx/wsdlcache



ref: https://serverfault.com/questions/582483/php-upgrade-always-breaks-session-folder-permissions

PHP ldap_bind Can't contact LDAP server


CentOS 7 

vi /etc/openldap/ldap.confg

最後加上

TLS_REQCERT never

然後重啟

nginx, php-fpm

打完收功

PHP RTL Arabic, Hebrew

用 PHP 檢查 希伯來文, 阿拉伯文的編碼位置

http://unicode-table.com/cn/#hebrew
http://unicode-table.com/cn/#arabic

設定 rtl 為 false
設定 unicode 範圍
取得內文第一個字
使用 json_encode 轉成 unicode
取得字元並轉成大寫
比對字元是否在範圍中
回傳 rtl

function get_rtl($content)
{
$rtl = false;
$rtl_character_table = array(
// hebrew
'0590','0591','0592','0593','0594','0595','0596','0597','0598','0599','059A','059B','059C','059D','059E','059F',
'05A0','05A1','05A2','05A3','05A4','05A5','05A6','05A7','05A8','05A9','05AA','05AB','05AC','05AD','05AE','05AF',
'05B0','05B1','05B2','05B3','05B4','05B5','05B6','05B7','05B8','05B9','05BA','05BB','05BC','05BD','05BE','05BF',
'05C0','05C1','05C2','05C3','05C4','05C5','05C6','05C7','05C8','05C9','05CA','05CB','05CC','05CD','05CE','05CF',
'05D0','05D1','05D2','05D3','05D4','05D5','05D6','05D7','05D8','05D9','05DA','05DB','05DC','05DD','05DE','05DF',
'05E0','05E1','05E2','05E3','05E4','05E5','05E6','05E7','05E8','05E9','05EA','05EB','05EC','05ED','05EE','05EF',
'05F0','05F1','05F2','05F3','05F4','05F5','05F6','05F7','05F8','05F9','05FA','05FB','05FC','05FD','05FE','05FF',
// arabic
'0600','0601','0602','0603','0604','0605','0606','0607','0608','0609','060A','060B','060C','060D','060E','060F',
'0610','0611','0612','0613','0614','0615','0616','0617','0618','0619','061A','061B','061C','061D','061E','061F',
'0620','0621','0622','0623','0624','0625','0626','0627','0628','0629','062A','062B','062C','062D','062E','062F',
'0630','0631','0632','0633','0634','0635','0636','0637','0638','0639','063A','063B','063C','063D','063E','063F',
'0640','0641','0642','0643','0644','0645','0646','0647','0648','0649','064A','064B','064C','064D','064E','064F',
'0650','0651','0652','0653','0654','0655','0656','0657','0658','0659','065A','065B','065C','065D','065E','065F',
'0660','0661','0662','0663','0664','0665','0666','0667','0668','0669','066A','066B','066C','066D','066E','066F',
'0670','0671','0672','0673','0674','0675','0676','0677','0678','0679','067A','067B','067C','067D','067E','067F',
'0680','0681','0682','0683','0684','0685','0686','0687','0688','0689','068A','068B','068C','068D','068E','068F',
'0690','0691','0692','0693','0694','0695','0696','0697','0698','0699','069A','069B','069C','069D','069E','069F',
'06A0','06A1','06A2','06A3','06A4','06A5','06A6','06A7','06A8','06A9','06AA','06AB','06AC','06AD','06AE','06AF',
'06B0','06B1','06B2','06B3','06B4','06B5','06B6','06B7','06B8','06B9','06BA','06BB','06BC','06BD','06BE','06BF',
'06C0','06C1','06C2','06C3','06C4','06C5','06C6','06C7','06C8','06C9','06CA','06CB','06CC','06CD','06CE','06CF',
'06D0','06D1','06D2','06D3','06D4','06D5','06D6','06D7','06D8','06D9','06DA','06DB','06DC','06DD','06DE','06DF',
'06E0','06E1','06E2','06E3','06E4','06E5','06E6','06E7','06E8','06E9','06EA','06EB','06EC','06ED','06EE','06EF',
'06F0','06F1','06F2','06F3','06F4','06F5','06F6','06F7','06F8','06F9','06FA','06FB','06FC','06FD','06FE','06FF'
);

$first_chart = mb_substr( trim( $content ), 0, 1, 'UTF-8' );
$unicode     = json_encode( $first_chart );
$character   = strtoupper( substr( $unicode, 3, -1 ) );

if( in_array($character, $rtl_character_table) )
{
// echo $character;
$rtl = true;
}

return $rtl;
}

PHP cURL POST IIS


使用PHP curl POST 給IIS時要把字陣列改成字串


原本
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, array('foo' => 'bar'));

改成
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, 'foo=bar');

Codeigniter View Cache

使用CI的Cache注意的地方

1. 更改cache資料夾權限可讀寫

2.可以將指令放在任何地方, 我放在 __construct 裡, 因為我要全部都輸出.
$this->output->cache(m); // m 分鐘

3.cache 在 $this->load->view(); 這個指令 cache 才會存檔
假設你在某個 control 底下的 function 下 echo 指令, cache 會存成空白
你必需下 $this->load->view(); 產出資料才會有資料

4. cache檔名是用該網頁完整路徑的md5下去命名.

Codeigniter Upload PowerPoint Error

Codeigniter Version 2.1.3

Change system code

/system/libraries/Upload.php

Line: 1078
$this->file_type = $matches[1];
Change to
$this->file_type = ($matches[1] == 'application/vnd.ms-office' ? $file['type'] : $matches[1]);

Line: 1091
$this->file_type = $matches[1];
Change to
$this->file_type = ($matches[1] == 'application/vnd.ms-office' ? $file['type'] : $matches[1]);

Line: 1109
$this->file_type = $matches[1];
Change to
$this->file_type = ($matches[1] == 'application/vnd.ms-office' ? $file['type'] : $matches[1]);

Add Mine Type in Application mimes.php

add .pptx in /application/config/mimes.php
'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/zip'),

FreeBSD phpDocumentor 安裝


phpDocumentor
讓你要交接程式時可以快速了解你的程式碼.
  1. 更新 ports
    cvsup -g -L 2 ports-supfile
  2. 安裝  PEAR
    /usr/port/devel/pear
    make install clean
  3. 利用 PEAR 安裝 PhpDocumentor 使用以下指令
    pear install PhpDocumentor
  4. 完成安裝, 使用使用 phpdoc 下指令.

參考網址:
http://www.phpdoc.org/

PHP ISSEU: htmlspecialchars & htmlentities

兩個用法不一樣,
自己手太賤亂加,
又沒有注意使用方法,
造成用ajax POST 資料存進去了亂碼,
像&reg;這符號
EX: ®
使用htmlspecialchars存就會正常,
使用htmlentities存就會出現多於的亂碼,
因為htmlspecialchars只轉換&, <, >, ", '這些符號,
而htmlentities會轉化所有的html代碼, 因為在AJAX POST傳送時, ® 已經被轉成%C2%AE

PHP Module: Gettext


Gettext 要在原本的 php5-extensions 中設定
/usr/ports/lang/php5-extensions
make config
勾選 gettext的項目
make install clean
裝完後在重啟 apache2
在檢查 phpinfo 裡面的 gettext 有沒有啟動
有就表示成功了
接下來要下載 Poedit
來編輯 xgettext 所編釋出來的 po
在分存到各國家的資料夾下

Function
xgettext -d [poFile] [Src] --from-code=UTF8
將[Src]裡的檔案轉成PO檔
msgmerge -o [poFile] [poOld] [poNew]
將[poNew]和[poOld]檢查合併
msgfmt -o [moFile] [poFile]
將[poFile]轉成[moFile]
locale -a

檢查FreeBSD的語言檔名

putenv('LANG=zh_TW');
setlocale(LC_ALL, 'zh_TW.UTF-8');
// Specify location of translation tables
bindtextdomain("index", "./locale");
// Choose domain
textdomain("index");

GEOIP


公司很大, 需要判斷使用者是哪個國家的人,
將他們導到所屬的在地網站,
前輩指示使用GEOIP來判斷使用者,

到GOOGLE查GEOIP就會出現MaxMind,
http://www.maxmind.com/app/ip-location

它支援Apache和PHP
在這裡我們使用PHP

1.
先安裝Apache的GEOIP
我的OS是FreeBSD
安裝路徑
/usr/ports/net/GeoIP
進入資料夾後鍵入 make install clean安裝完即可

設定檔在
/usr/local/etc/GeoIP.conf
資料檔在(資料檔可依使用者喜好移動)
/usr/local/share/GeoIP/GeoIP.dat

2.
下載PHP的需要的檔案
http://geolite.maxmind.com/download/geoip/api/php/
進入連結下載這三個檔案,
geoip.inc
geoipcity.inc
geoipregionvars.php
將這三個檔放至同一資料夾管理.

然後開啟其中的
sample.php
裡面有說明如何使用,
照著裡面方式做,
就會得到國家的縮寫和全名,

3.
在測試成功後,
你可以分在做一個檔,
在這裡我取名叫
geoipurl.php
裡面設定了一個以國家縮寫為索引網址為值的陣列.
EX:
$GEOIP_URL = array(
    "TW" => "http://tw.yahoo.com/",
    "US" => "http://www.yahoo.com/"
);

當使用者進到首頁時,
我會取得他的IP,
透過GEOIP的程式分析它來自哪一國的國家縮寫,
在透過縮寫找到網址轉到我的子公司網站.
轉址便完成.

附上一段判斷使用者IP的程式

if(!empty($_SERVER[HTTP_X_FORWARDED_FOR])){
    $proxy_ip=split(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
    define("REMOTE_IP",$proxy_ip[0]);
}else{
    if(!empty($_SERVER[HTTP_RLNCLIENTIPADDR]))
        define("REMOTE_IP",$_SERVER[HTTP_RLNCLIENTIPADDR]);
    else 
        define("REMOTE_IP",$_SERVER[REMOTE_ADDR]);
}




增長知識的PHP開發者年會

我不知道有這個活動
還是同事分享的 =________________="

PHPConf Taiwan 2011 上的議題
有關CSS的部份
以上3種是將以程式來編譯出CSS, 相當的方便, 不用打一堆CSS.

有關JavaScript的部份
透過簡短的程式碼來編釋出完整的JavsScript的程式.

有關PHP的部份
PHP Unint [https://github.com/sebastianbergmann/phpunit]
都是PHP的Framework, 由於我已經熟Codeigniter了, 其他的就等我有空再研究吧.


應該是台灣人寫的, 用PHP寫出來的報價網站.

PHP error_reporting

當你的程式沒問題,
資料庫也沒問題,
卻出現一堆錯誤,
又不影響網頁執行
試著到php.ini裡設定

error_reporting = E_ALL & ~E_NOTICE

它就會把不必要的錯誤訊息隱藏

phpMyAdmin 關聯表

1. 先去載最新的phpMyAdmin吧!!!
http://www.phpmyadmin.net

2. 安裝新的phpMyAdmin 把它解壓縮到Appserv/www下. (如果你的預設是如此!!!)

3. 設定config.inc.php(拷貝 config.sample.inc.php 重新命名)
進入config.inc.php把以下註解拿掉
    $cfg['Servers'][$i]['controluser'] = 'pma';
    $cfg['Servers'][$i]['controlpass'] = 'pmapass';
    $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
    $cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';
    $cfg['Servers'][$i]['relation'] = 'pma_relation';
    $cfg['Servers'][$i]['table_info'] = 'pma_table_info';
    $cfg['Servers'][$i]['table_coords'] = 'pma_table_coords';
    $cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages';
    $cfg['Servers'][$i]['column_info'] = 'pma_column_info';
    $cfg['Servers'][$i]['history'] = 'pma_history';
    $cfg['Servers'][$i]['tracking'] = 'pma_tracking';
    $cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords';
    $cfg['Servers'][$i]['userconfig'] = 'pma_userconfig';

4. 匯入phpmyadmin關聯表的SQL
到你剛才的phpMyadmin資料夾下的phpMyAdmin/scripts/create_tables.sql
找到create_tables.sql
開啟網頁進入phpMyAdmin的主頁找到"匯入"把"create_tables.sql"匯入
就會產生phpmyadmin的資料庫

5. 新增phpMyAdmin的使用權限.
在config.inc.php的預設帳號pma密碼pmapass (你可以改成你自己想要的)
一樣在phpMyAdmin的主頁選擇"權限"
新增使用者"pma"主機"%"密碼"pmapass"權限都不要給,
新增完後進入pma的管理, 選擇phpmyadmin的資料庫給它, 權限全給.

6. 把你想關聯的資料庫裡的資料表都改成InnoDB關聯才有作用.
進入每個表的"操作/管理"更改引擎為InnoDB


接下來請參考這裡
http://note.tcc.edu.tw/267.html

FreeBSD FreeTDS MSSQL Connect setting

設定PHPMSSQL的問題
FreeBSD放在/usr/local/etc/freetds.conf.dist
cp一份新的為freetds.conf再加入設定

ex:
freetds.conf 
[mshost]
    host = 172.0.0.1
    port = 1433
    tds version = 7.0
    client charset = UTF-8
mssql.php
    $ms_host = "mshost"; //172.0.0.1
    $ms_user = "msuser";
    $ms_pass = "mspass";
    $ms_db   = "msdb";

PHP$ms_host設定要和freetds.conf的括號內名稱一樣, 就可以順利連上MSSQL了.

PHP ini register_globals

register_globals = on/off
 
假如register_globals 設定為on 的情形下,
會造成POST, COOKIE, SESSION 如果有相同的變數會跟著一起改變,
最近公司的工作因為這個困擾了我一天...
為何在FreeBSD 下執行都沒事, 
但搬回Windows 卻有這樣的問題, 
主要是因為FreeBSDPHP.ini 設定 
register_globals = off
Windows 起初設定為
register_globals = on 
改回來之後, 就沒這個問題了.
 
發生的現象, 
假設
$db = new database;
POST, SESSIONCOOKIE 裡有設定db為變數時,
$_POST['db'] / $_SESSION['db'] / $_COOKIE['db'] 
的值則會跟著存 class database
所以架設Server設定時要注意這個設定.

IE中iframe跨域丟失Session問題p3p

關鍵字: session 丟失p3p
  整合客戶的登錄時,或者其他一個網站通過iframe時,特別是一個http頁面,訪問一個https頁面時,常常會session失效!
1、由於IE的安全限制,將父面所在域加入信任站點就OK了!
2、當“父”頁面是https的,通過iframe去訪問https頁面時,
<iframe name="loginFrame" id="loginFrame" frameborder=NO scrolling=NO src="" class="iframeBody" ></iframe>
會報“有不安全的信息”
辦法是: src="/" 就OK!
3、當客戶設置了1時,還是不行時,怎麼辦呢? 又查詢了一些網上的資料!
IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)協議默認阻止第三方無隱私安全聲明的cookie,Firefox目前還不支持P3P安全特性,firefox中自然也不存在此問題了。
在frameset裡面,也就是裡面的frame是來自第三方站點(不同IP或不同域名),那麼默認情況下IE會自動禁用這些站點的cookie,也就是在請求某url時在HTTP header裡不發送它們的cookie,包括session的cookie。 注意,這些站點在response裡面設置的cookie還是會被發送到瀏覽器的。
在用戶瀏覽a.php時A.com寫入的為第一方Cookie,其嵌入的iframe指向b.php.這時B.com寫入的就為第三方Cookie了,所以它是被IE當在了大門外。 所以,每次當用戶提交的cookie提交時,就掛掉了.因為傳不到真實的服務器.

解決方案.
PHP的程序
可以直接在B網站中寫入
<?php
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"')
?>
這樣就能接受第三方的Cookie啦。
lighttpd的服務器
server.modules = ("mod_setenv")
setenv.add-response-header = ( "P3P" => "CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'")
apache的服務器
<VirtualHost>
Header set P3P 'CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'
</VirtualHost>
IIS的服務器
增加一個網站http頭來解決問題;
管理工具——〉選擇一個網站——〉屬性——〉http頭,增加一個http頭
然後輸入頭名:P3P
輸入頭內容:CP=CAO PSA OUR
jsp頁面:
<%
response.setHeader("P3P","CP=CAO PSA OUR");
%>
java代碼最簡單的辦法,增加一個filte:
public class TransNameFilter extends HttpServlet implements Filter {
private static org.apache.commons.logging.Log logWriter = LogFactory.getLog(TransNameFilter.class.getName());
/*
*
*/
public TransNameFilter() {
super();
}
/*(非Javadoc)
*@see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig arg0) throws ServletException {
}
/*(非Javadoc)
*@see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest hreq = (HttpServletRequest) request;
String transName = hreq.getParameter("transName");
if (Util.isNullOrEmpty(transName)) {
logWriter.fatal(" there is no transName for this request");
}else{
logWriter.info(" transName is " + transName);
}
  
HttpServletResponse res = (HttpServletResponse) response;
//iframe引起的內部cookie丟失
res.setHeader("P3P","CP=CAO PSA OUR");
if (chain != null)
chain.doFilter(request, response);
}
/*非Javadoc)
*@see javax.servlet.Filter#destroy()
*/
public void destroy() {
}
}