<?php error_reporting(E_ALL | E_STRICT); ini_set('display_errors', 'On'); chdir(__DIR__); $configFile = 'server-config.php'; if (!file_exists($configFile) || !is_readable($configFile)) { trigger_error('Unable to read configuration file: ' . $configFile . ' Use server-config.php.dist as a template to create server-config.php.dist'); } include $configFile; $helperSet = (isset($helperSet)) ? $helperSet : new \Symfony\Component\Console\Helper\HelperSet(); $cli = new \Symfony\Component\Console\Application('Drest Server Command Line Interface Tool'); $cli->setCatchExceptions(true); $cli->setHelperSet($helperSet); $cli->addCommands(array( // Drest Commands new Drest\Tools\Console\Command\CheckDefinitions(), new Drest\Tools\Console\Command\CheckProductionSettings() )); $cli->run();Doctrine是基於資料庫抽象層上的ORM,它可以透過PHP物件輕鬆存取所有的資料庫,例如MYSQL,REST與技術無關,代表的是一種軟體架構風格,REST是Representational State Transfer的簡稱,中文翻譯為「表徵狀態轉移」REST從資源的角度類別檢視整個網絡,它將分佈在網路中某個節點的資源透過URL進行標識,客戶端應用透過URL來獲取資源的表徵,獲得這些表徵致使這些應用轉變狀態所有的數據,不過是透過網路取得的還是操作(增刪改查)的數據,都是資源,將一切數據視為資源是REST區別與其他架構風格的最本質屬性對於REST這種面向資源的架構風格,有人提出一種全新的結構理念,即:資源導向架構(ROA:Resource Oriented Architecture
<?php namespace DMS\Filter; class Filter implements FilterInterface { protected $metadataFactory; protected $filterLoader; public function __construct(Mapping\ClassMetadataFactory $metadataFactory, $filterLoader) { $this->metadataFactory = $metadataFactory; $this->filterLoader = $filterLoader; } public function filterEntity($object) { $this->walkObject($object); } public function filterProperty($object, $property) { $this->walkObject($object, $property); }PHP 過濾器用於驗證和過濾來自非安全性來源的資料。 測試、驗證和過濾使用者輸入或自訂資料是任何 Web 應用程式的重要組成部分。 PHP 的過濾器擴充功能的設計目的是讓資料過濾更輕鬆快速。 為什麼要使用過濾器? 幾乎所有的 Web 應用程式都依賴外部的輸入。這些數據通常來自使用者或其他應用程式(例如 web 服務)。透過使用過濾器,您能夠確保應用程式獲得正確的輸入類型。 您應該始終對外部資料進行過濾! 輸入過濾是最重要的應用程式安全主題之一。
<?php namespace ByteUnits; class ArithmeticTest extends \PHPUnit_Framework_TestCase { public function testAddInSameUnitSystem() { $this->assertEquals(Metric::bytes(10), Metric::bytes(5)->add(Metric::bytes(5))); $this->assertEquals(Binary::bytes(10), Binary::bytes(5)->add(Binary::bytes(5))); } public function testRemoveInSameUnitSystem() { $this->assertEquals(Metric::bytes(3), Metric::bytes(5)->remove(Metric::bytes(2))); $this->assertEquals(Binary::bytes(3), Binary::bytes(5)->remove(Binary::bytes(2))); } public function testAutoboxing() { $this->assertEquals(Metric::bytes(10), Metric::bytes(5)->add(5)); $this->assertEquals(Metric::bytes(10), Metric::bytes(5)->add('5B')); $this->assertEquals(Metric::bytes(3), Metric::bytes(5)->remove(2)); $this->assertEquals(Metric::bytes(3), Metric::bytes(5)->remove('2B')); }本函式庫可以快速的幫你轉換位元組單位。 1個位元組等於8bit即1byte = 8 bit,下面是KB,MB,GB,TB的換算1KB = 1024 byte1MB = 1024KB = 1024 X 1024byte1MB = 1024KB = 1024 X 1024byte#1GB = 1024MB1TB = 1024GB###
<?php namespace KzykHys\Text; class Text implements \Serializable { private $text; public function __construct($text = '') { $this->text = (string) $text; } public static function create($text = '') { return new static($text); } public function append($text) { $this->text .= (string) $text; return $this; }這是一個屬於靜態正規表示式函式庫。 TPL 全稱為 Text Processing Library(文字處理庫)。 spirit、xpressive 是很好的東西,實作 TPL 函式庫中對這兩者有所借鑒。說起來開發 TPL 函式庫的理由看起來還蠻好笑的:原因是 spirit、xpressive 太慢。不是執行慢,而是編譯慢。
<?php namespace Swap\Service; use Exchanger\Service\Service; use Http\Client\HttpClient; use Http\Discovery\HttpClientDiscovery; use Http\Discovery\MessageFactoryDiscovery; use Http\Message\RequestFactory; class Factory { private $httpClient; private $requestFactory; private $registry; public function __construct(HttpClient $httpClient = null, RequestFactory $requestFactory = null) { $this->httpClient = $httpClient ?: HttpClientDiscovery::find(); $this->requestFactory = $requestFactory ?: MessageFactoryDiscovery::find(); $this->registry = new Registry(); } public function setHttpClient(HttpClient $httpClient) { $this->httpClient = $httpClient; } public function setRequestFactory(RequestFactory $requestFactory) { $this->requestFactory = $requestFactory; }匯率是指一國貨幣與另一國貨幣的比率或比價,或以一國貨幣表示的另一國貨幣的價格。匯率變動對一國進出口貿易有著直接的調節作用。在某些條件下,透過使本國貨幣對外貶值,即讓匯率上升,會起到促進出口、限制進口的作用;反之,本國貨幣對外升值,即匯率下降,則起到限制出口、增加進口的作用。
<?php require_once __DIR__ . '/../bootstrap.php'; $loop = \React\EventLoop\Factory::create(); $scheduler = new \Rx\Scheduler\EventLoopScheduler($loop); $source1 = \Rx\Observable::fromArray(range(0, 100)); $source2 = \Rx\Observable::fromArray(range(0, 100)); $source = $source1->combineLatest([$source2], function($value1, $value2){ return "First: {$value1}, Second: {$value2}"; })->take(4); $subscription = $source->subscribe($stdoutObserver, $scheduler); $loop->run();擴充函式庫是php擴充的功能,例如php本來不支援操作某種功能,但在新版本想對它提供支援,就以擴充的方式來提供,這樣,我們在配置php時,如果我們不用此功能,我們就可以讓php不加載他.從而節省伺服器資源.提供其性能 php的擴展庫一般放在php目錄下的ext目錄裡.你在網上下載的php壓縮包解壓後應該可以看到. php.ini中的extension_dir 用來指定你的副檔名的位址 。
套接字的编程步骤 在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK! SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsigned short为网络字节序的格式 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); 客户端代码如下: #include <Winsock2.h> #include <stdio.h> void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData );加载套接字库 if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup()( ); return; } SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);创建套接字(socket)。 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向服务器发出连接请求(connect)。 char recvBuf[100];和服务器端进行通信(send/recv)。 recv(sockClient,recvBuf,100,0); printf("%s\n",recvBuf); send(sockClient,"This is lisi",strlen("This is lisi")+1,0); closesocket(sockClient);关闭套接字。 WSACleanup()();//必须调用这个函数清除参数 }#
這是一個可以發送和接受訊息的客戶端,下面給大家示範一下發送和接受的操作,需要的朋友可以自行下載後嘗試一下。 發送訊息<?phptry { $rcf = new RdKafka\Conf(); $rcf->set('group.id', 'test'); $cf = new RdKafka\TopicConf(); $cf->set('offset.store.method', 'broker'); $cf->set('auto.offset.reset', 'smallest'); $rk = new RdKafka\Producer($rcf); $rk->setLogLevel(LOG_DEBUG); $rk->addBrokers("127.0.0.1"); $topic = $rk->newTopic("test", $cf); for($i = 0; $i < 1000; $i++) { $topic->produce(0,0,'test' . $i);//没有setMessge接口了,使用produce 参考:https://libraries.io/github/mentionapp/php-rdkafka } } catch (Exception $e) { echo $e->getMessage();接收訊息<?phptry { $rcf = new RdKafka\Conf(); $rcf->set('group.id', 'test'); $cf = new RdKafka\TopicConf();/* $cf->set('offset.store.method', 'file'); */ $cf->set('auto.offset.reset', 'smallest'); $cf->set('auto.commit.enable', true); $rk = new RdKafka\Consumer($rcf); $rk->setLogLevel(LOG_DEBUG); $rk->addBrokers("127.0.0.1"); $topic = $rk->newTopic("test", $cf); //$topic->consumeStart(0, RD_KAFKA_OFFSET_BEGINNING); while (true) { $topic->consumeStart(0, RD_KAFKA_OFFSET_STORED); $msg = $topic->consume(0, 1000); var_dump($msg); if ($msg->err) { echo $msg->errstr(), "\n"; break; } else { echo $msg->payload, "\n"; } $topic->consumeStop(0); sleep(1); } } catch (Exception $e) { echo $e->getMessage(); }#
<div class="form-group"> <label for="tag">标签</label> <select name="tag" value='{$result["tag"]}' class="form-control input-lg"> <option value="shenghuomiaozhao" <?php echo ($result["tag"]=="shenghuomiaozhao")?"selected":"" ?>>生活妙招</option> <option value="fenleijieshao" <?php echo ($result["tag"]=="fenleijieshao")?"selected":""?> >分类介绍</option> <option value="huanbaohudong" <?php echo ($result["tag"]=="huanbaohudong")?"selected":""?> >环保互动</option> <option value="huishouliucheng" <?php echo ($result["tag"]=="huishouliucheng")?"selected":""?> >回收流程</option> </select> </div>這是一個選項類型的PHP函式庫,最終實現的效果。如果有需要的朋友可以直接下載這份php-option-master選項類型庫
php artisan migrate #输出Migration table created successfully. Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table php artisan migrate:rollback #输出Rolled back: 2014_10_12_100000_create_password_resets_table Rolled back: 2014_10_12_000000_create_users_table php artisan make:migration create_article_table --create='articles' #输出Created Migration: 2015_03_28_050138_create_article_table <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateArticleTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('articles', function(Blueprint $table) { $table->increments('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('articles'); } }database migrations 是laravel最強大的功能之一。資料庫遷移可以理解為資料庫的版本控制器。 在 database/migrations 目錄中包含兩個遷移文件,一個建立使用者表,一個用於使用者密碼重設。 在遷移檔案中,up 方法用來建立資料表,down方法用來回滾,也就是刪除資料表。
<?php /** * Munee: Optimising Your Assets * * @copyright Cody Lundquist 2013 * @license http://opensource.org/licenses/mit-license.php */ $ds = DIRECTORY_SEPARATOR; $muneePath = __DIR__ . $ds . '..'; spl_autoload_register(function ($class) use ($ds, $muneePath) { $path = str_replace('\', DIRECTORY_SEPARATOR, $class); foreach (array('src', 'tests') as $dirPrefix) { $file = $muneePath . $ds . $dirPrefix . $ds . $path . '.php'; if (file_exists($file)) { require_once $file; break; } } }); defined('WEBROOT') || define('WEBROOT', __DIR__ . $ds . 'tmp'); require_once $muneePath . $ds . 'config' . $ds . 'bootstrap.php';圖片壓縮裁剪,CSS,JS 檔案合併和minified,這些工作是網站開發中,必不可少的,但是這些工做如果都是自己來處理,會非常麻煩,所以今天就推荐一個用於最佳化圖片,CSS,JS 等網站附件的全功能PHP 類別庫:Munee。 Munee 有強大的快取功能,可以在伺服器端和用戶端伺服器上快取資源。並且整合了 Imagine 這個工具用於圖片的處理,可以在線上快速調整圖片大小,或裁剪圖片等。 Munee 可以自動編譯 LESS,SCSS 和 CoffeeScript,並且還能將多個 CSS 和 JS 檔案合併成一個請求,以及最小化和 GZip 壓縮這些檔案以節省頻寬和更好的網站的效能。
Monolog是php下比較全又容易擴充的記錄日誌類別庫。目前有包括Symfony 、Laravel、 CakePHP等諸多知名php框架都內建了Monolog。 Monolog可以把你的日誌送到文件,sockets,收件箱,資料庫和各種web services。 Monolog遵循PSR3的介面規範,可以很輕易的替換成其他遵循相同規範的日誌類別庫。 Monolog具有良好的擴充性,透過Handler、Formatter和Processor這幾個接口,可以對Monolog類別庫進行各種擴充和自訂。 基本用法<?php use Monolog\Logger; use Monolog\Handler\StreamHandler; // 创建日志频道 $log = new Logger('name'); $log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); // 添加日志记录 $log->addWarning('Foo'); $log->addError('Bar');核心概念每一個Logger實例都包含一個頻道名稱(channel)和handler的堆疊。當你新增一筆記錄時,記錄會依序通過handler堆疊的處理。而每個handler也可以決定是否把記錄傳遞到下一個堆疊裡的下一個handler。 透過handler,我們可以實作一些複雜的日誌操作。例如我們把StreamHandler放在堆疊的最下面,那麼所有的日誌記錄最終都會寫到硬碟檔案裡。同時我們把MailHandler放在堆疊的最上面,透過設定日誌等級把錯誤日誌透過郵件發送出去。 Handler裡有個$bubble屬性,這個屬性定義了handler是否攔截記錄不讓它流到下一個handler。所以如果我們把MailHandler的$bubble參數設定為false,則出現錯誤日誌時,日誌會透過MailHandler傳送出去,而不會經過StreamHandler寫到硬碟上。 Logger可以建立多個,每個都可以定義自己的頻道名稱和handler堆疊。 handler可以在多個Logger中共享。頻道名稱會反映在日誌裡,方便我們檢視和篩選日誌記錄。 如果沒有指定日誌格式(Formatter),Handler會使用預設的Formatter。 日誌的等級不能自訂,目前使用的是RFC 5424裡定義的8個等級:debug、info、notice、warning、error、critical、alert和emergency。如果對日誌記錄有其他的需求,可以透過Processo對日誌記錄新增內容。 日誌等級DEBUG (100): 詳細的debug資訊。 INFO (200): 關鍵事件。 NOTICE (250): 普通但是重要的事件。 WARNING (300): 出現非錯誤的例外。 ERROR (400): 執行階段錯誤,但不需要立刻處理。 CRITICA (500): 嚴重錯誤。 EMERGENCY (600): 系統不可用。