MySQL 双主 Master to Master 架构部署方法

为了演示部署过程,我通过 VMware 创建了两台主机,分别为 TestServer1(192.168.0.1) 和 TestServer2(192.168.0.2)。两台主机均安装了 CentOS 6.9。

MySQL 通过源码进行编译,我选择的是 mysql-5.6.41.tar.gz 这个版本的源码包。

编译安装过程如下:

创建 MySQL 的用户组和用户

# groupadd mysql
# useradd -g mysql mysql

阅读更多

Linux进程间通信的六种主要手段

1.管道(Pipe)及有名管道(named pipe)

管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

2.信号(Signal)

信号是比较复杂的通信方式,用于通知接受进程有某种事件生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期 信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上, 该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,sigaction函数重新实现了signal函数);

3.报文(Message)队列(消息队列)

消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

阅读更多

如何正确看待软件开发技术外包价格的高低

软件外包这个事,随着需求的不同,价格区间跨度本来就是会相当大。一个软件有报几千的,也有报几万的,差距相当大,一个网站,一款软件或者一个完整的系统,其结构功能复杂与否首先只能确定其价格底线。多数的企业只考虑表面的代码开发费用,至于后期的方案是否可以匹配上业务、运营和维护几乎都没有考虑。

一心只通过价格来选择开发人员,也就容易在后期跟外包方产生纠葛,而通常在这样的状况下,基本上所开发出的软件或者系统,也就不太可能运营出效果,反而浪费了企业发展的时间。这样算下来,为了当初省去的几万块钱,而赔掉了可能几十万,几百万,甚至几千万的市场,想想还真是得不偿失。

阅读更多

用 MiniFramework 实现文件上传功能

MiniFramework 是一款遵循 Apache2 开源协议发布的,支持 MVC 和 RESTful 的超轻量级 PHP 开发框架。

在 MiniFramework 最新的版本中,提供了上传文件的特性,下面我们来演示一下实现过程。

首先,新建一个名为 Upload 的 Controller,并在其中新建一个名为 index 的 Action,代码如下:

<?php
namespace App\Controller;

use Mini\Upload;

class Upload extends Action
{
    function indexAction()
    {
        if (! empty($_FILES)) {
            
            // 实例化 Upload 类
            $upload = new Upload();
            
            $res = $upload->save($_FILES['f']);
            if (! $res) {
                $errmsg = $upload->getErrorMsg();
                echo $errmsg;
            } else {
                dump($res);
            }
        }
        
        $this->view->display();
    }
}

上边的代码中,通过 use Mini\Upload; 引入了 MiniFramework 框架所提供的一个用于文件上传的类库。

在实例化 Upload 类后,通过调用 save 方法,并将 PHP 的 $_FILES 传入,来实现上传文件的保存。

在调用 save 方法后,若文件保存失败,可以通过 getErrorMsg 方法来获取错误信息。

如果文件保存成功,那么 save 方法会返回一个数组,其中包含有文件保存的路径和文件名,上边的示例代码中使用了 MiniFramework 内置的全局函数 dump() 来输出 save 所返回的数组。

另外,在实例化 Upload 类时,可传入一个数组类型的参数,对文件保存路径、大小和类型进行设定,例如:

// 配置数组
$config = array(

    // 文件保存的根目录
    'rootPath'  => PUBLIC_PATH . '/uploads',

    // 文件的大小限制(单位:Byte)
    'maxPath'   => 512000,

    // 允许的类型
    'allowType' => 'bmp,gif,jpg,jpeg,png'

);

// 实例化 Upload 类时,将配置数组作为参数传入
$upload = new Upload($config);

上边的代码中,常量 PUBLIC_PATH 是 MiniFramework 内置用于定义站点根目录所对应的路径,默认对应的是 Public 目录所在的路径

接下来创建视图,在 View 目录中创建一个名为 upload 的目录,将视图文件保存到 View/upload/index.php,代码如下:

<h1>Upload</h1>
<form method="post" enctype="multipart/form-data">
  <input type="file" name="f" >
  <input type="submit" value="upload" /></p>
</form>

完成上述步骤后,便可以访问类似下面的地址来测试了
http://你的域名/index.php?c=upload&a=index

如果你的站点开启了伪静态,那么访问地址可以是下面这样:
http://你的域名/upload/index

上边的 URL 中,最后的 index 可以省略,例如:
http://你的域名/upload

阳光部落原创,更多内容请访问http://www.sunbloger.com/

解决 PHP 设置 open_basedir 与 eAccelerator 冲突问题

为 PHP 设置了 open_basedir 后,发现使用 require 和 include 始终会报出下面这样的 Warning 信息:

Warning: require(): open_basedir restriction in effect. File() is not within the allowed path(s)

这个 Warning 信息中,require 和 File 的括号中都是空白没有内容的,经过反复检查代码,确认所引用的路径在 open_basedir 允许的范围内。

通过去国外网站搜索资料,发现是因为 open_basedir 与 eAccelerator 冲突造成的。

需要重新编译一次 eAccelerator,编译时需要带上 –without-eaccelerator-use-inode 参数。

编译完重新启动 php-fpm 并删除之前的 eAccelerator 缓存文件即可。

阳光部落原创,更多内容请访问http://www.sunbloger.com/

阳光部落2018端午小改版

变化如下:

  1. 调整了栏目设置,将原有的“编程开发”、“数据库”、“操作系统”和“软件应用”四个分类统一归入“技术”分类下。
  2. 调整了导航的显示位置,移到了页面最顶端。
  3. 更换了代码高亮显示的样式,新样式使用的是 Sublime text 风格。

欢迎各博主和本站建立友链,联系方式:jasonwei06@hotmail.com

PHP 开源框架 MiniFramework 发布 1.1.0 版

MiniFramework 是一款遵循 Apache2 开源协议发布的,支持 MVC 和 RESTful 的超轻量级 PHP 开发框架。MiniFramework 能够帮助开发者用最小的学习成本快速构建 Web 应用,在满足开发者最基础的分层开发、数据库和缓存访问等少量功能基础上,做到尽可能精简,以帮助您的应用基于框架高效运行。

MiniFramework于2018年6月10日发布1.1.0版本,变化有:

* 新增Captcha类,用于生成和校验图片验证码
* 新增Registry类的unset方法,用于删除已注册的变量
* 新增全局函数browserDownload(),用于让浏览器下载文件
* 在App目录中,新增名为Example的控制器,其中包含部分功能的示例代码

MiniFramework 1.1.0 版本下载地址
zip格式:https://github.com/jasonweicn/MiniFramework/archive/1.1.0.zip
tar.gz格式:https://github.com/jasonweicn/MiniFramework/archive/1.1.0.tar.gz

MiniFramework 快速入门文档
地址:http://www.miniframework.com/docv1/guide/

近期版本更新主要变化回顾:

1.0.13

* 改进Db_Mysql中的execTrans方法
* 改进渲染特性
* 新增全局函数isImage(),用于判断文件是否为图像格式
* 新增全局函数getStringLen(),用于获取字符串长度(支持UTF8编码的汉字)

1.0.12

* 新增Session类,用于读写会话数据

1.0.11

* 改进转换伪静态地址分隔符的机制
* 优化路由处理伪静态时的性能
* 优化部分核心类的属性
* 优化框架内存占用

MiniFramework新增了图片验证码输出和校验功能

今天为 MiniFramework 新增了一个名为 Captcha 的类,用于图片验证码的输出和校验。

具体用法如下:

用 MiniFramework 新建一个名为 Example 的控制器,例如:

<?php
namespace App\Controller;

use Mini\Action;
use Mini\Captcha;

/**
 * Example
 */
class Example extends Action
{
    function captchaAction()
    {
        if (!empty($_POST['code'])) {
            $captcha = new Captcha();
            $res = $captcha->check($_POST['code']);
            if ($res) {
                $this->view->assign('info', 'success');
            } else {
                $this->view->assign('info', 'fail');
            }
            $this->view->assign('code', $_POST['code']);
        }
        
        $this->view->display();
    }
    
    function getcaptchaAction()
    {
        $captcha = new Captcha();
        $captcha->create();
    }
}

 

同时创建视图,代码如下:

<?php if (isset($this->code)) echo '<p>input code: ' . $this->code . '</p>';?>
<?php if (isset($this->info)) echo '<p>check result: ' . $this->info . '</p>';?>
<img src="getcaptcha" onclick="this.src='getcaptcha?t='+Math.random()" />
<form method="post" action="captcha">
  <p>code:<input type="text" name="code" value="" />
  <input type="submit" value="check" /></p>
</form>

 

创建完成后,访问 http://你的域名/example/captcha 即可看到效果。

上边的代码已经包含在 MiniFramework 位于 GitHub 的 master 主线上。

GitHub源代码地址:https://github.com/jasonweicn/MiniFramework

采用http协议做IM拉取消息的流程设计

接手一个在线客服的项目,本质上就是一个 IM 项目。

第一个想到的是用 WebSocket,然而一些客观因素导致这个项目很难采用 WebSocket 来做。那么,就只好用 http 实现,并为此设计了如下流程:

如图,首先 Browser 端发起一个拉取消息的请求。Server 端收到请求后,立即查询是否有新消息,如查询到了新消息,则立即返回结果给 Browser 端。

Browser 端收到返回结果后,再次发起一个新的拉取消息的请求,如此往复进行。

若 Server 端接到拉取请求后,没有查询到新消息,则 Hold 住这个请求进程,同时设置一个时间阈值,比如5秒。

在这5秒内,Server 端反复查询是否有新消息,当发现了新消息后,则立即向 Browser 端返回结果同时结束掉进程。若始终都没有新消息,则在达到预设的时间阈值后,向 Browser 端返回一个通知,告知 Browser 端这次没有新消息。

在这个流程中,Browser 端发出请求后,可能会立即收到结果,也可能在5秒后得知没有新消息,不论是否有新消息,在得到 Server 端反馈后,都要立即再次发出请求。

阳光部落原创,更多内容请访问http://www.sunbloger.com/