PHP
文章平均质量分 55
koastal
这个作者很懒,什么都没留下…
展开
-
关于在线答题系统设计的一些想法
业务场景100道不定项选择题,不同考生的题目顺序不一样200位考生在规定时间同时开始和结束答题在考场后台的办公室中可以实时刷新分数的排行榜考试环境为学校的机房,网络环境为局域网考试题目为文学类知识竞赛,考生准考证号和身份证号分别作为用户名和密码#需求分析1、为了避免相互抄袭,不同考生的题目顺序需要不一样,这里需要打乱题目的顺序。2、考试开始作答的时间可能不同,但是都要在统一的时间截止答题,这就要求考生的机器需要统一时间,能够在考试结束后自动提交。3、在考试过程中要能够查看分数排行版,这里原创 2021-01-19 19:27:21 · 1113 阅读 · 1 评论 -
php使用redis
在服务器上安装redis在ubuntu上安装redis服务器和客户端apt-get install redis-serverapt-get install redis-clientPHP使用redis添加redis扩展php的redis扩展下载地址:https://github.com/phpredis/phpredis/releases 下载并安装redis扩展wget https://git原创 2016-08-07 19:28:17 · 467 阅读 · 4 评论 -
swoole多进程操作
多个任务同时执行 将顺序执行的任务,转化为并行执行(任务在逻辑上可以并行执行)比如,我们要对已知的用户数据进行判断,是否需要发送邮件和短信,如果需要发送则发送。不使用多进程时,我们首先判断是否发送邮件,如果需要则发送;然后再判断是否需要发送短信,如果需要则发送。如果发送邮件耗时2s,发送短信耗时2s,那么我们完成任务大概需要4s左右的时间。如果我们使用多线程的话,可以开两个线程,一个用于处理邮原创 2016-10-20 12:18:12 · 11158 阅读 · 0 评论 -
使用swoole异步发送邮件
发送邮件的操作一般是比较耗时的,所以我们一般采用异步或者队列来执行。php使用redis的publish/subscribe也是一种不错的选择,这在以前的一篇博文中写过。 http://blog.csdn.net/koastal/article/details/52813669今天写一下,php语言本身是不支持异步操作的,不过我们可以通过swoole扩展实现异步功能,这个异步功能基于tcp协议,相原创 2016-10-16 23:35:49 · 5409 阅读 · 3 评论 -
php使用redis作为消息队列
安装redisredis不在centos官方源里面,需要手动下载EPEL(Extra Packages for Enterprise Linux)进行安装。 EPEL相当于是原来源的扩展,具体的介绍可以看下这两篇文章http://blog.chinaunix.net/uid-2469966-id-3916408.htmlhttp://f.dataguru.cn/thread-4792...原创 2016-10-14 10:26:08 · 12411 阅读 · 4 评论 -
PHP提高SESSION响应速度的几种方法
设置多级目录存储SESSION将SESSION存储到redis中及时释放SESSION锁如果网站中大量的使用了ajax技术,则在高并发的情况下有可能会发生SESSION请求被阻塞的情况,也就是执行session_start()失败的情况。这只因为上一个操作该session_id对应的文件还没有释放,接下来操作的请求就不能满足,导致死锁。我们可以通过下面的几种方法缓解SESSION死锁的情况:不要滥用原创 2016-10-31 20:56:03 · 3691 阅读 · 0 评论 -
浅谈cookie和session的关系
<?phpsession_start();echo $sid = session_id();$_SESSION['name']='zhezhao';$_SESSION['age']=23;首次访问首次访问该页面 我们可以看到,首次访问该页面,请求的http协议头并没有包含cookie信息;返回的http协议头包含了设置cookie信息的内容。设置cookie:PHPSESSID的值为ses原创 2016-09-07 00:09:30 · 3297 阅读 · 0 评论 -
php通过socket调用http和smtp协议
socket发送HTTP请求http协议请求报文格式get## 请求方法 请求文件路径?查询字符串 HTTP/协议版本号## Host: 主机名:端口号## Connection:closepost## 请求方法 请求文件路径 HTTP/协议版本号## Host: 主机名:端口号## Content-type: application/x-www-form-urlencoded## Con原创 2016-11-13 16:24:07 · 2274 阅读 · 0 评论 -
基于session.upload_progress 的文件上传进度显示
介绍session.upload_progress 是PHP5.4的新特征。 当 session.upload_progress.enabled INI 选项开启时,PHP 能够在每一个文件上传时监测上传进度。 这个信息对上传请求自身并没有什么帮助,但在文件上传时应用可以发送一个POST请求到终端(例如通过XHR)来检查这个状态。 当一个上传在处理中,同时POST一个与INI中设置的s原创 2016-10-31 11:05:33 · 5659 阅读 · 5 评论 -
多文件上传
基于HTML5的多文件上传html5的上传文件标签,支持multiple属性,可以使我们很方便的选择多个文件进行上传。前台上传文件页面 index.html<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>多文件上传实例</title></head><body><div style="w原创 2016-11-01 12:09:51 · 653 阅读 · 0 评论 -
PHP中散列密码的安全
php的基本哈希函数已经不再安全?php手册中有专门的一个部分来介绍这个问题 http://php.net/manual/zh/faq.passwords.php很多应用,都是将用户的密码都是直接通过md5加密直接存储到数据库中的,包括我最近在用的开源项目zabbix的web管理界面。$password = "1234";$hash = md5($password);echo $res;php原创 2016-11-04 20:49:25 · 1163 阅读 · 0 评论 -
swoole和redis异步任务
redis异步任务interface.php<?phpfor($i=0;$i<100;$i++){ $msg = "zhezhao[".$i."]"; $redis = new Redis(); $redis->connect("127.0.0.1"); $redis->publish("test",$msg); $redis->close();}han原创 2016-10-20 09:43:56 · 5811 阅读 · 2 评论 -
php通过pecl方式安装扩展
安装peclcd /usr/local/php/bin/wget http://pear.php.net/go-pear.phar -O go-pear.phpphp go-pear.php##回车默认安装安装php扩展pecl search key-word #用于查找扩展pecl install key-word #用于安装扩展查询相关扩展[root@localhost src原创 2016-10-18 16:56:30 · 7471 阅读 · 0 评论 -
php中的对象引用和复制
参考文章:http://blog.csdn.net/clh604/article/details/11367329引用$tv2 = $tv1;或者$tv2 = &$tv1;以上两种方式,效果是一样的。可以理解为linux里面的硬链接。克隆(浅复制)$tv2 = clone $tv1;“浅复制”:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。也就是说,浅原创 2016-08-09 15:55:06 · 976 阅读 · 0 评论 -
PHP中的self、static、parent关键字
看到php里面有关于后期静态绑定的内容,虽然没有完全看懂,但是也收获不少东西。php官方手册介绍: http://php.net/manual/zh/language.oop5.late-static-bindings.php不存在继承的时候不存在继承的意思就是,就书写一个单独的类来使用的时候。self和static在范围解析操作符 (::) 的使用上,并无区别。在静态函数中,self和stat原创 2016-08-09 21:22:21 · 5949 阅读 · 0 评论 -
简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。UML图简单工厂模式中包含的角色及其相应的职责如下: 工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工原创 2016-08-10 10:04:54 · 463 阅读 · 0 评论 -
php中的依赖注入
依赖注入是一种允许我们从硬编码的依赖中解耦出来,从而在运行时或者编译时能够修改的软件设计模式。我到现在依然不大明白上面“依赖注入”的定义是什么,有兴趣可以参考下《PHP之道》上面对“依赖注入”的 解释。 http://laravel-china.github.io/php-the-right-way/#dependency_injection简而言之就是可以让我们在类的方法中更加方便的调用与之关原创 2016-08-10 19:32:36 · 907 阅读 · 0 评论 -
命名空间
php的命名空间的样式跟linux的路径很相似。我们使用文件的路径作为命名空间。定义命名空间MVC\Model\index.php代码<?phpnamespace MVC\Model;class Index{ public static function test() { echo "test#Model"; }}使用命名空间MVC\Applicat原创 2016-08-11 11:40:48 · 474 阅读 · 0 评论 -
array_map和array_walk
array_map和array_walk都是对数组的每个元素调用相关函数进行处理。bool array_walk ( array &$array , callable $funcname );array array_map ( callable $callback , array $arr1 );不同的是,array_walk直接将函数处理的结果反映到数组,而array_map是返回一个处理完成的原创 2016-08-25 10:53:58 · 706 阅读 · 0 评论 -
无刷新文件上传
使用FromData通过XHR上传使用ajax技术,能够以xhr的方式,实现无刷新的表单数据的提交和响应。但是这种方式仅仅能够传递一般的参数,也就是以字符串的形式传递key和value。XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的原创 2016-11-01 12:12:45 · 493 阅读 · 0 评论 -
http重定向总结
301 “HTTP/1.1 301 Moved Permanently”, 302 “HTTP/1.1 302 Found”, 303 “HTTP/1.1 303 See Other”, 307 “HTTP/1.1 307 Temporary Redirect”,302状态码是为了兼容HTTP1.0的,在HTT原创 2016-11-03 20:47:14 · 1187 阅读 · 0 评论 -
Ubuntu编译安装PHP和Nginx
编译安装nginx切换目录到工作文件夹:cd /usr/local/src下载pcre源代码并安装wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-10.20.tar.gztar -zxvf pcre2-10.20.tar.gzmv ./pcre2-10.20.tar.gz ./pcre cd pcre./c原创 2016-04-01 17:24:46 · 1322 阅读 · 1 评论 -
web服务器配置gzip压缩
什么是gzip压缩 HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这原创 2016-11-04 23:33:30 · 4026 阅读 · 0 评论 -
Oauth2.0 获得access_token以后
前段时间写了一篇博客 OAuth2.0的学习和实践,以新浪微博为例,简述了Oauth2.0的授权流程和使用方法。 一个成功的授权流程可分为以下几步:开发者提供第三方登录按钮用户点击登录,去第三方授权(微博,QQ,微信等)授权完成,跳转到开发者提供的callback地址,并给出code参数。开发者使用提前在第三方网站上申请的App_key和App_Secret以及上一步的code参数,向第三原创 2016-07-13 16:12:13 · 5895 阅读 · 0 评论 -
在线答题系统的设计
系统说明共100道不定项选择题,存储在MySQL数据表(ques)中每个考生的题目顺序不一样150人同时答题和交卷系统设计时间同步要求考生在同一时间进行交卷,就要统一时间。因此我们以服务器时间为准,在考生登录时获取服务器时间作为开始时间。打乱题目顺序使用mysql中的by rand()方式打乱题目顺序,其中rand种子是考生的考号。可以保证每个考生的题目顺序是不同的,但是又能保证自己题目的顺原创 2017-01-08 13:53:44 · 13151 阅读 · 3 评论 -
RabbitMQ任务分发
RabbitMQ中文文档 http://rabbitmq.mr-ping.com/在RabbitMQ的文档中,对于任务分发是放在“工作队列”这一章节介绍的。在后面介绍扇形、直连、主题交换机时并没有提到,在学习的过程中容易误认为只有默认交换机才具有任务分发机制。RabbitMQ中消息的分发有3个过程 1. 生产者将消息发送到交换机 2. 交换机将消息分发到队列 3. 队列将消息分发给消费者 在步原创 2017-08-31 23:56:59 · 1166 阅读 · 0 评论 -
php基于namespace的类自动加载
PhpStorm中设置命名空间Loader.php<?phpnamespace MVC;class Loader{ public static function autoload($namespace){ $path = trim(str_replace(__NAMESPACE__,"",$namespace),DIRECTORY_SEPARATOR).".php";原创 2017-12-10 21:04:50 · 947 阅读 · 0 评论 -
大文件分块上传
前端代码使用file.slice将文件进行分割,然后分别进行异步上传。html lang="zh-cn"> head> meta charset="utf-8"> meta http-equiv="X-UA-Compatible" content="IE=edge"> meta name="viewport" content="width=device-wid原创 2018-01-05 19:36:47 · 2341 阅读 · 0 评论 -
基于timestamp和nonce的防止重放攻击方案
以前总是通过timestamp来防止重放攻击,但是这样并不能保证每次请求都是一次性的。今天看到了一篇文章介绍的通过nonce(Number used once)来保证一次有效,感觉两者结合一下,就能达到一个非常好的效果了。 重放攻击是计算机世界黑客常用的攻击方式之一,所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。首先要明确一个事情,重...原创 2016-12-04 21:32:44 · 44402 阅读 · 39 评论 -
商品秒杀问题的解决方案
引言假设num是存储在数据库中的字段,保存了被秒杀产品的剩余数量。if($num > 0){ //用户抢购成功,记录用户信息 $num--;}假设在一个并发量较高的场景,数据库中num的值为1时,可能同时会有多个进程读取到num为1,程序判断符合条件,抢购成功,num减一。这样会导致商品超发的情况,本来只有10件可以抢购的商品,可能会有超过10个人抢到,此时num原创 2018-01-07 21:59:11 · 4925 阅读 · 3 评论 -
Laravel5.6使用CKEditor5的相关配置
Laravel 相关配置文件的上传与存储参考文档: https://laravel-china.org/docs/laravel/5.6/requests/1367#1d60f1 https://laravel-china.org/docs/laravel/5.6/filesystem/1390 https://docs.ckeditor.com/ckeditor4/latest...原创 2018-06-12 17:15:13 · 3958 阅读 · 0 评论 -
更好的php日志记录方式
改造前:makeLog("[file:".__FILE__.";line:".__LINE_."]".$msg);改造后:makeLog($msg);日志记录函数:function makeLog($msg){ $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS,1); $file = $trace[...原创 2018-10-17 19:39:30 · 1260 阅读 · 2 评论 -
php多进程使用场景
安装pcntl扩展php多进程模块依赖pcntl扩展,官方手册介绍:http://php.net/manual/zh/book.pcntl.php Note: 1. 此扩展在 Windows 平台上不可用。 2. 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。因此,不能再PHP Web开发中使用多进程。# 通过pecl安装pcntl扩展s原创 2017-09-04 12:39:16 · 6108 阅读 · 0 评论 -
Discuz数据库引擎转换
MyISAM与InnoDB的对比 https://www.biaodianfu.com/mysql-myisam-innodb.htmlMyISAM的读取性能要比InnoDB好一些,但这略微的优势远比不上InnoDB的行级锁和事务操作等特性。MySQL从5.6开始,将InnoDB作为默认的数据库引擎,因此除非需要使用MyISAM的特有功能,都应该使用InnoDB数据库引擎。Discuz论坛中的帖子原创 2017-07-09 01:18:23 · 1861 阅读 · 0 评论 -
单例模式
单例模式就是只创建一个类的实例,在PHP中常用语数据库类的封装。将__construct设为私有,防止new实例化将__clone设为私有,防止对象克隆添加返回单一实例的方法,getInstance<?phpclass Demo{ private static $instance; private function __construce(){ } priv原创 2016-08-25 11:36:32 · 361 阅读 · 0 评论 -
二级域名之间共享cookie
简介login.koastal.com设置domain为koastal.com,则www.koastal.com即可访问该cookie。 也就是说二级域名(或者三级域名)之间可以通过这种方式共享cookie。 其实cookie的domain属性的用法跟path有些类似,比如我们将cookie的path设置为/,则/user目录下也可以访问该cookie。实践Apache同一端口对应不同域名htt原创 2017-04-12 19:57:57 · 4610 阅读 · 0 评论 -
百度贴吧“神来一句”功能分析
最近需要为论坛做一个类似百度贴吧的“神来一句”的功能,对其相关实现进行了分析,并给出自己的实现方式。原创 2017-04-17 15:00:40 · 1062 阅读 · 0 评论 -
获取文件后缀名的几种方式
PHP使用strrpos,分割字符串<?phpfunction suffix($name){ $index = strrpos($name,"."); return substr($name,$index,strlen($name)-$index);}echo suffix('koastal.png');使用pathinfo,获取后缀名<?phpfunction suffix原创 2017-05-16 19:53:15 · 2056 阅读 · 0 评论 -
优雅的URL(伪静态)
摘自Yii,说明文档apache# 设置文档根目录为 "basic/web"DocumentRoot "path/to/basic/web"<Directory "path/to/basic/web"> # 开启 mod_rewrite 用于美化 URL 功能的支持(译注:对应 pretty URL 选项) RewriteEngine on # 如果请求的是真实存在的文件或原创 2017-04-24 21:30:31 · 1136 阅读 · 0 评论 -
容器类的两种实现方式
通过魔术方法实现classclass MagicContainer{ private $ele; function __construct() { $this->ele = []; } function __set($name, $value) { $this->ele[$name] = $value; }原创 2017-05-19 13:56:07 · 1003 阅读 · 0 评论