存檔

‘php’ 分類的存檔

php-fpm不輸出php錯誤日志

2016年12月18日 沒有評論

使用如下php的配置
php-fpm.conf

php.ini

當通過瀏覽器訪問系統發生500錯誤時,不記錄錯誤日志內容,通過使用php在命令行直接執行php腳本卻可以生成錯誤日至到日志文件。
說明php的配置正確,后臺能夠生成日志,問題應該出在php腳本自身上。

查詢源碼后發現php中有error_reporting(0);屏蔽了所有錯誤。
修改成error_reporting(E_ALL);可以生成錯誤信息到日志文件了。

分類: php 標簽: ,

您需要安裝舊 Java SE 6 運行環境才能打開“PhpStorm”

2015年11月1日 沒有評論

mac安裝java1.8之后打開phpstrom會報這個錯誤。

解決辦法:
1.在終端下進入/Applications/PhpStorm.app/Contents目錄,然后編輯Info.plist

2.修改JVMVersion的值為1.8
JVMVersion
1.8*

3.重新打開phpstrom

分類: php 標簽:

什么是psr-0,psr-1,psr-2標準

2015年3月7日 沒有評論

FIG組織在制定跟PHP相關規范,簡稱PSR,PSR旨在通過討論我們代碼項目的共同點以找出一個協作編程的方法。

什么是psr0強調自動加載的方式
下文描述了若要使用一個通用的自動加載器(autoloader),你所需要遵守的規范:

規范

一個完全標準的命名空間(namespace)和類(class)的結構是這樣的:\()*
每個命名空間(namespace)都必須有一個頂級的空間名(namespace)("組織名(Vendor Name)")。
每個命名空間(namespace)中可以根據需要使用任意數量的子命名空間(sub-namespace)。
從文件系統中加載源文件時,空間名(namespace)中的分隔符將被轉換為 DIRECTORY_SEPARATOR。
類名(class name)中的每個下劃線_都將被轉換為一個DIRECTORY_SEPARATOR。下劃線_在空間名(namespace)中沒有什么特殊的意義。
完全標準的命名空間(namespace)和類(class)從文件系統加載源文件時將會加上.php后綴。
組織名(vendor name),空間名(namespace),類名(class name)都由大小寫字母組合而成。
示例

空間名(namespace)和類名(class name)中的下劃線

以上是我們為實現通用的自動加載而制定的最低標準。你可以利用能夠自動加載PHP 5.3類的SplClassLoader來測試你的代碼是否符合這些標準。

實例

下面是一個怎樣利用上述標準來實現自動加載的示例函數。

SplClassLoader實現

下面的gist是一個按照上面建議的標準來自動加載類的SplClassLoader實例。這是依據這些標準來加載PHP 5.3類的推薦方案。

什么是psr1,定義基本代碼規范
本節我們將會討論一些基本的代碼規范問題,以此作為將來討論更高級別的代碼分享和技術互用的基礎。

RFC 2119中的必須(MUST),不可(MUST NOT),建議(SHOULD),不建議(SHOULD NOT),可以/可能(MAY)等關鍵詞將在本節用來做一些解釋性的描述。

1. 概述

源文件必須只使用 這兩種標簽。

源文件中php代碼的編碼格式必須只使用不帶字節順序標記(BOM)的UTF-8。

一個源文件建議只用來做聲明(類(class),函數(function),常量(constant)等)或者只用來做一些引起副作用的操作(例如:輸出信息,修改.ini配置等),但不建議同時做這兩件事。

命名空間(namespace)和類(class) 必須遵守PSR-0標準。

類名(class name) 必須使用駱駝式(StudlyCaps)寫法 (譯者注:駝峰式(cameCase)的一種變種,后文將直接用StudlyCaps表示)。

類(class)中的常量必須只由大寫字母和下劃線(_)組成。

方法名(method name) 必須使用駝峰式(cameCase)寫法(譯者注:后文將直接用camelCase表示)。

2. 文件

2.1. PHP標簽

PHP代碼必須只使用長標簽()或者短輸出式標簽(<?= ?>);而不可使用其他標簽。

2.2. 字符編碼

PHP代碼的編碼格式必須只使用不帶字節順序標記(BOM)的UTF-8。

2.3. 副作用

一個源文件建議只用來做聲明(類(class),函數(function),常量(constant)等)或者只用來做一些引起副作用的操作(例如:輸出信息,修改.ini配置等),但不建議同時做這兩件事。

短語副作用(side effects)的意思是 在包含文件時 所執行的邏輯與所聲明的類(class),函數(function),常量(constant)等沒有直接的關系。

副作用(side effects)包含但不局限于:產生輸出,顯式地使用require或include,連接外部服務,修改ini配置,觸發錯誤或異常,修改全局或者靜態變量,讀取或修改文件等等

下面是一個既包含聲明又有副作用的示例文件;即應避免的例子:

下面是一個僅包含聲明的示例文件;即應提倡的例子:

3. 空間名(namespace)和類名(class name)

命名空間(namespace)和類(class)必須遵守 PSR-0.

這意味著一個源文件中只能有一個類(class),并且每個類(class)至少要有一級空間名(namespace):即一個頂級的組織名(vendor name)。

類名(class name) 必須使用StudlyCaps寫法。

PHP5.3之后的代碼必須使用正式的命名空間(namespace) 例子:

4. 類的常量、屬性和方法

術語類(class)指所有的類(class),接口(interface)和特性(trait)

4.1. 常量

類常量必須只由大寫字母和下劃線(_)組成。 例子:

4.2. 屬性

本指南中故意不對$StulyCaps,$camelCase或者$unser_score中的某一種風格作特別推薦,完全由讀者依據個人喜好決定屬性名的命名風格。

但是不管你如何定義屬性名,建議在一個合理的范圍內保持一致。這個范圍可能是組織(vendor)級別的,包(package)級別的,類(class)級別的,或者方法(method)級別的。

4.3. 方法

方法名則必須使用camelCase()風格來聲明。

什么是PSR2定義代碼風格

代碼風格指南
本手冊是基礎代碼規范(PSR-1)的繼承和擴展。

為了盡可能的提升閱讀其他人代碼時的效率,下面例舉了一系列的通用規則,特別是有關于PHP代碼風格的。

各個成員項目間的共性組成了這組代碼規范。當開發者們在多個項目中合作時,本指南將會成為所有這些項目中共用的一組代碼規范。 因此,本指南的益處不在于這些規則本身,而在于在所有項目中共用這些規則。

RFC 2119中的必須(MUST),不可(MUST NOT),建議(SHOULD),不建議(SHOULD NOT),可以/可能(MAY)等關鍵詞將在本節用來做一些解釋性的描述。

1. 概述

代碼必須遵守 PSR-1。

代碼必須使用4個空格來進行縮進,而不是用制表符。

一行代碼的長度不建議有硬限制;軟限制必須為120個字符,建議每行代碼80個字符或者更少。

在命名空間(namespace)的聲明下面必須有一行空行,并且在導入(use)的聲明下面也必須有一行空行。

類(class)的左花括號必須放到其聲明下面自成一行,右花括號則必須放到類主體下面自成一行。

方法(method)的左花括號必須放到其聲明下面自成一行,右花括號則必須放到方法主體的下一行。

所有的屬性(property)和方法(method) 必須有可見性聲明;抽象(abstract)和終結(final)聲明必須在可見性聲明之前;而靜態(static)聲明必須在可見性聲明之后。

在控制結構關鍵字的后面必須有一個空格;而方法(method)和函數(function)的關鍵字的后面不可有空格。

控制結構的左花括號必須跟其放在同一行,右花括號必須放在該控制結構代碼主體的下一行。

控制結構的左括號之后不可有空格,右括號之前也不可有空格。

1.1. 示例

這個示例中簡單展示了上文中提到的一些規則:

2. 通則

2.1 基礎代碼規范

代碼必須遵守 PSR-1 中的所有規則。

2.2 源文件

所有的PHP源文件必須使用Unix LF(換行)作為行結束符。

所有PHP源文件必須以一個空行結束。

純PHP代碼源文件的關閉標簽?> 必須省略。

2.3. 行

行長度不可有硬限制。

行長度的軟限制必須是120個字符;對于軟限制,代碼風格檢查器必須警告但不可報錯。

一行代碼的長度不建議超過80個字符;較長的行建議拆分成多個不超過80個字符的子行。

在非空行后面不可有空格。

空行可以用來增強可讀性和區分相關代碼塊。

一行不可多于一個語句。

2.4. 縮進

代碼必須使用4個空格,且不可使用制表符來作為縮進。

注意:代碼中只使用空格,且不和制表符混合使用,將會對避免代碼差異,補丁,歷史和注解中的一些問題有幫助。空格的使用還可以使通過調整細微的縮進來改進行間對齊變得更加的簡單。
2.5. 關鍵字和 True/False/Null

PHP關鍵字(keywords)必須使用小寫字母。

PHP常量true, false和null 必須使用小寫字母。

3. 命名空間(Namespace)和導入(Use)聲明

命名空間(namespace)的聲明后面必須有一行空行。

所有的導入(use)聲明必須放在命名空間(namespace)聲明的下面。

一句聲明中,必須只有一個導入(use)關鍵字。

在導入(use)聲明代碼塊后面必須有一行空行。

示例:

4. 類(class),屬性(property)和方法(method)

術語“類”指所有的類(class),接口(interface)和特性(trait)。

4.1. 擴展(extend)和實現(implement)

一個類的擴展(extend)和實現(implement)關鍵詞必須和類名(class name)在同一行。

類(class)的左花括號必須放在下面自成一行;右花括號必須放在類(class)主體的后面自成一行。

實現(implement)列表可以被拆分為多個縮進了一次的子行。如果要拆成多個子行,列表的第一項必須要放在下一行,并且每行必須只有一個接口(interface)。

4.2. 屬性(property)

所有的屬性(property)都必須聲明其可見性。

變量(var)關鍵字不可用來聲明一個屬性(property)。

一條語句不可聲明多個屬性(property)。

屬性名(property name) 不推薦用單個下劃線作為前綴來表明其保護(protected)或私有(private)的可見性。

一個屬性(property)聲明看起來應該像下面這樣。

4.3. 方法(method)

所有的方法(method)都必須聲明其可見性。

方法名(method name) 不推薦用單個下劃線作為前綴來表明其保護(protected)或私有(private)的可見性。

方法名(method name)在其聲明后面不可有空格跟隨。其左花括號必須放在下面自成一行,且右花括號必須放在方法主體的下面自成一行。左括號后面不可有空格,且右括號前面也不可有空格。

一個方法(method)聲明看來應該像下面這樣。 注意括號,逗號,空格和花括號的位置:

4.4. 方法(method)的參數

在參數列表中,逗號之前不可有空格,而逗號之后則必須要有一個空格。

方法(method)中有默認值的參數必須放在參數列表的最后面。

參數列表可以被拆分為多個縮進了一次的子行。如果要拆分成多個子行,參數列表的第一項必須放在下一行,并且每行必須只有一個參數。

當參數列表被拆分成多個子行,右括號和左花括號之間必須又一個空格并且自成一行。

4.5. 抽象(abstract),終結(final)和 靜態(static)

當用到抽象(abstract)和終結(final)來做類聲明時,它們必須放在可見性聲明的前面。

而當用到靜態(static)來做類聲明時,則必須放在可見性聲明的后面。

4.6. 調用方法和函數

調用一個方法或函數時,在方法名或者函數名和左括號之間不可有空格,左括號之后不可有空格,右括號之前也不可有空格。參數列表中,逗號之前不可有空格,逗號之后則必須有一個空格。

參數列表可以被拆分成多個縮進了一次的子行。如果拆分成子行,列表中的第一項必須放在下一行,并且每一行必須只能有一個參數。

5. 控制結構

下面是對于控制結構代碼風格的概括:

控制結構的關鍵詞之后必須有一個空格。
控制結構的左括號之后不可有空格。
控制結構的右括號之前不可有空格。
控制結構的右括號和左花括號之間必須有一個空格。
控制結構的代碼主體必須進行一次縮進。
控制結構的右花括號必須主體的下一行。
每個控制結構的代碼主體必須被括在花括號里。這樣可是使代碼看上去更加標準化,并且加入新代碼的時候還可以因此而減少引入錯誤的可能性。

5.1. if,elseif,else

下面是一個if條件控制結構的示例,注意其中括號,空格和花括號的位置。同時注意else和elseif要和前一個條件控制結構的右花括號在同一行。

推薦用elseif來替代else if,以保持所有的條件控制關鍵字看起來像是一個單詞。

5.2. switch,case

下面是一個switch條件控制結構的示例,注意其中括號,空格和花括號的位置。case語句必須要縮進一級,而break關鍵字(或其他中止關鍵字)必須和case結構的代碼主體在同一個縮進層級。如果一個有主體代碼的case結構故意的繼續向下執行則必須要有一個類似于// no break的注釋。

5.3. while,do while

下面是一個while循環控制結構的示例,注意其中括號,空格和花括號的位置。

下面是一個do while循環控制結構的示例,注意其中括號,空格和花括號的位置。

5.4. for

下面是一個for循環控制結構的示例,注意其中括號,空格和花括號的位置。

5.5. foreach

下面是一個foreach循環控制結構的示例,注意其中括號,空格和花括號的位置。

5.6. try, catch

下面是一個try catch異常處理控制結構的示例,注意其中括號,空格和花括號的位置。

6. 閉包

聲明閉包時所用的function關鍵字之后必須要有一個空格,而use關鍵字的前后都要有一個空格。

閉包的左花括號必須跟其在同一行,而右花括號必須在閉包主體的下一行。

閉包的參數列表和變量列表的左括號后面不可有空格,右括號的前面也不可有空格。

閉包的參數列表和變量列表中逗號前面不可有空格,而逗號后面則必須有空格。

閉包的參數列表中帶默認值的參數必須放在參數列表的結尾部分。

下面是一個閉包的示例。注意括號,空格和花括號的位置。

參數列表和變量列表可以被拆分成多個縮進了一級的子行。如果要拆分成多個子行,列表中的第一項必須放在下一行,并且每一行必須只放一個參數或變量。

當列表(不管是參數還是變量)最終被拆分成多個子行,右括號和左花括號之間必須要有一個空格并且自成一行。

下面是一個參數列表和變量列表被拆分成多個子行的示例。

把閉包作為一個參數在函數或者方法中調用時,依然要遵守上述規則。

7. 結論

本指南有意的省略了許多元素的代碼風格。主要包括:

全局變量和全局常量的聲明

函數聲明

操作符和賦值

行間對齊

注釋和文檔塊

類名的前綴和后綴

最佳實踐

以后的代碼規范中可能會修正或擴展本指南中規定的代碼風格。

分類: php 標簽:

php或js判斷網站訪問者來自手機或者pc端源碼

2015年3月6日 沒有評論

之前寫過如何通過nginx來識別手機訪問還是pc訪問

很多時候也可以通過邏輯程序來進行判斷,如PHP、JS是常用的兩種識別訪問設備類型的常用方法。

原理都是采用識別訪問客戶端的HTTP_USER_AGENT,然后進行關鍵字匹配進行確定設備類型,對于偽造HTTP頭的就區分不出來了。

區分設備類型然后要做的就是能夠針對不同設置顯示出易于閱讀的網頁,具體可以研究響應式布局技術。

響應式布局

本文主要介紹如何通過php或js來識別終端類型。

php識別手機或者PC訪問源碼

方法二

js區分手機或PC訪問源碼

方法一

方法二

分類: php 標簽:

spl_autoload_register替代__autoload()

2015年3月5日 1 條評論

PHP5.1.2起廢棄了__autoload,那么為什么要用spl_autoload_register來取代__autoload()

最重要的原因是autoload只能定義一個自動加載函數,spl_autoload_register可注冊多個自動加載函數到函數棧,實例話對象時會按順序依次調用之前注冊過的加載器來自動加載類定義文件。看起來沒什么用,但當多個工程混合使用時有自己不懂同的自動加載類實現時,就能體現出優勢了。

__autoload()是一個自動加載函數,在PHP5中,當我們實例化一個未定義的類時,就會觸發此函數。
printit.class.php

index.php

訪問index.php會輸出hello world。在index.php中,沒有包含printit.class.php,在實例化PRINTIT時,自動調用__autoload函數,參數$class的值即為類名PRINTIT,此時printit.class.php就被包含到index.php中,避免到處都是include或require,程序更加簡潔。

spl_autoload_register()

bool spl_autoload_register ([ callback $autoload_function ] )
將函數autoload_function注冊到SPL提供的__autoload函數棧中。
如果該棧中的函數尚未激活,則激活它們。
如果在你的程序中已經實現了__autoload函數,它必須顯式注冊到__autoload棧中。
因為spl_autoload_register()函數會將Zend Engine中的__autoload函數取代為spl_autoload()或spl_autoload_call()。

參數
autoload_function
欲注冊的自動裝載函數。如果沒有提供任何參數,則自動注冊autoload的默認實現函數spl_autoload()。

返回值
如果成功則返回 TRUE,失敗則返回 FALSE。

注:SPL是Standard PHP Library(標準PHP庫)的縮寫。它是PHP5引入的一個擴展庫,其主要功能包括autoload機制的實現及包括各種Iterator接口或類。SPL autoload機制的實現是通過將函數指針autoload_func指向自己實現的具有自動裝載功能的函數來實現的。SPL有兩個不同的函數spl_autoload, spl_autoload_call,通過將autoload_func指向這兩個不同的函數地址來實現不同的自動加載機制。

spl_autoload_register實例

修改index.php中的__autoload換成loadprint函數。但是loadprint不會像__autoload自動觸發,需要使用spl_autoload_register()注冊到自動加載函數棧中,然后PHP碰到沒有定義的類實例化new時就執行loadprint(),參數時類名PRINTIT。

spl_autoload_register() 調用靜態方法

分類: php 標簽:

PHP當前時間毫秒

2015年2月1日 沒有評論

由于php中沒有long類型,找了不少計算時間的函數都是浮點數的毫秒,最后發現這個好用,分享給大家
返回當前計算機時間和GMT時間(格林威治時間)1970年1月1號0時0分0秒所差的毫秒數,與java中的currentTimeMillis一樣。

分類: php 標簽:

phpstrom 字體 注釋修改 自動換行

2015年2月1日 沒有評論

修改phpstrom編輯器字體
File -> Settings -> Editor -> Colors & Fonts -> Font
默認自己是灰色的不能修改,需要另存為一個scheme name才能編輯。

修改phpstrom界面字體
File -> Settings -> Appearance & Behavior -> Appearance -> UI option
選擇 Source Code Pro 字體

修改phpstrom php注釋作者樣式
File -> Settings -> Editor -> File and Code Templates -> Includes
PHP File Header選項

修改樣式

phpstrom在縮進位置而不是行首添加注釋
Settings -> Code Style -> PHP -> Other -> Code Commenting -> Line comment at first column
默認是打開的,需要將其關閉

phpstrom自動換行
File->Settings->Editor->General->Virtual Space
勾選 “ Use soft wrap in editor ” //在編輯器中自動換行

分類: php 標簽:

php解析yaml

2014年2月1日 1 條評論

根據官方定義,yaml不是一種標記語言,它是一種容易被人閱讀的數據序列化格式,容易與腳本語言交互,用來描述枚舉數組(sequences)和關聯數組(mappings).

ymal的語法:
Structure通過空格來展示。Sequence里的項用"-"來代表,Map里的鍵值對用":"分隔。

yaml實例

1.yaml表示sequence

每個數組元素以一個連字符和一個空格開頭,為了格式化漂亮,可以寫多個空格。
對應php代碼

yaml的枚舉數據可以出現在同一樣用'[]'包括起來。

2.yaml表示hash,關聯數組

yaml的關聯數組key的聲明后緊接著冒號,冒號后面跟著一個或多個空格。一般冒號后有一個空格就足夠了,為了好看,可以自己控制數量。
關聯數據對應用的php代碼

關聯數據也可以用'{}'包括起來寫在一行表示

yaml表示嵌套結構
通過行首縮進1個或多個空格表示多層結構,如:

這里為了描述方便,第二層使用了關聯數據表示,沒有使用連字符'-'格式。

等同于如下php代碼

yaml表示多個多多維數據,可以沒有root元素

yaml定義很容易記住,需要注意的重點就是縮進必須用一個或多個空格,不能使用tab縮進。

可以配置IDE的tab為2-4個空格,這樣按tab時就會插入空格,這樣當使用其它編輯器打開代碼是不會錯亂,保持良好的縮進。

分類: php 標簽: ,

mongodb非skip高效php分頁類

2014年1月19日 1 條評論

mongodb分頁skip+limit分頁要先查出所有結果再去跳過,這樣如果查詢頁面越往后效率越低。

如果能夠通過查詢條件查出每頁結果的最后一條記錄,在用最后一條記錄作為查詢條件去查下一頁,這樣每次都查詢頁面size條記錄,效率子讓不會差。

具體代碼如下:包含mongodb.class.php, page.class.php, test.php
mongodb.class.php mongodb 操作類

page.class.php mongodb分頁邏輯類

test.php 測試代碼

分類: php 標簽: , , ,

php獲取客戶端ip

2014年1月18日 沒有評論

分類: php 標簽:
极速快乐十分助手