<?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 1024byte1GB = 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): 系统不可用。