微羽网站服务器 PLAPI 插件系统 Demo

PLAPI.h

PLAPI.cpp

C++ 文件映射:在文件内创建视图

前言:

通常,经过磁盘的IO是异常缓慢的,使用 ReadFile() 来读取文件效率低下。因为 ReadFile() 的工作流程是这样的:

磁盘文件(慢速) --> 拷贝至内存缓冲区 --> 业务逻辑:读取/使用(第2次拷贝)

直接使用 ReadFile() 确实方便,但当遇到超大文件业务处理或者是IO密集型业务的时候就显得力不从心了。那么,Windows 为我们提供了 FileMapping 这样一种概念(Linux 平台称作 "mmap"),来将文件直接映射至内存的某一片区域,上层应用通过内存操作,直接存取数据,其流程如下:

内存(磁盘文件)  <--内存操作--> 业务逻辑

这样一来,有效解决了IO操作的效率。这次,我们讨论在文件内建立内存映射视图。

场景:

如果我们想要浏览一个并非从文件起始位置开始的文件视图,我们首先必须要创建文件映射对象。这个对象的大小就是该文件中你想要预览的内容外加偏移大小。例如,如果我们需要预览一个文件内从第 131,072  字节(128 KB) 开始向后 1 KB 字节的内容,我们必须要创建一个至少 132,096 字节(129 KB) 的内存映射视图。这个视图从文件内第 131,072 字节(128 KB) 开始并延伸至少 1,024 字节。本实例假定操作系统文件分配颗粒为 64 KB。(实际上 Windows 系统给出的默认值便是 64 KB)

文件映射块影响着我们视图的开始位置。一个文件视图的起始位置必须是分配颗粒(64 KB)的整数倍。因此,我们想要查看的数据应该是视图内文件偏移与分配块求模。视图的大小就是数据与分配颗粒求模的偏移,外加上你想要使用的数据大小。

举个例子,我们使用 GetSystemInfo() 这样一个 API 来确定到分配颗粒的大小实际上就是 64 KB。因此,我们要通过内存映射来使用一个 138,240 字节(135 KB) 文件中的 1KB 数据,分为以下几件事:

  • 创建一个至少 139,264 字节(136 KB) 的内存映射对象。
  • 计算偏移量,文件偏移量是文件分配粒度小于所需偏移量的最大倍数。文件从偏移量开始起始。在本例中,视图从 128 KB 起始。视图的大小便是 136 KB - 128 KB (8 KB)。
  • 在视图内创建一个偏移量为 7 KB 的指针指向我们感兴趣的 1 KB 的内容。

如果我们想要访问的数据超越了分配颗粒边界,我们应该创建一个大于分配颗粒大小的视图。这避免将数据打散成零散的碎片部分。

下面是上面例子的 C++ 代码实现。

代码清单:

使用文件映射确实挺复杂,要读取数据,首先得计算各类偏移,还要判断读取位置是否越界,遇到超长文件更需要做分段映射操作。相比 ReadFile() 可是麻烦了几个数量级。但是,对于IO密集的业务来说,优质的IO操作代码,还是必要的。

参考文献:

  • MSDN,  Creating a View Within a File,  https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa366548(v=vs.85).aspx

博客开始采用Plume(微羽网站服务器)运行啦!

Plume 经过一段时间的开发和整理,已经取得了不少层面的突破。

在这一段相当长的时间里,我收货颇多。在 Plume 逐渐加入了 PLAPI 插件系统、FastCGI、SSL 安全传输等功能后,我终于能够将我的主站(iEdon Inside,本博客)使用 Plume 来支持运行了。

Plume 0.3.7 Plume 0.3.7 Plume 0.3.7

目前唯一的毛病就是不支持 URL 重写。看样子开发这个不是太容易了,不过我还是会尝试的。目前采用的办法:使用伪静态方案解决。

很少来主站看看,这里已经相当冷清了。现在冒个泡吧,将来还有很长的路要走。

[Plume] 使用微羽个人网站服务器打造Windows下的PHP环境

引言:

Plume HTTP Server(微羽个人网站服务器) 是一款面向个人、开发者以及前端工作者的一款简便的 HTTP 服务器。通过本软件,可以轻松地打造 Windows 下 PHP 环境。

运行中的实例:

  1. iEdon 的家庭网站(搭建于家用下载机/NAS上,动态DNS,PHP,WordPress)http://home.iedon.com:88/
  2. iEdon 公开站 http://pub.iedon.com:90/(搭建于公网服务器,CGI 程序)

步骤:

1.首先获得 Plume 的 0.2.8p1 版本:点击下载 Plume HTTP Server 0.2.8p1

2.建议解压到非系统盘目录。

3.双击 PlumeGUI.exe,点击安装按钮。(如果数字卫士、某某管家之类的软件弹出提示,请点击允许)

PL01

安装完成后,应该能看到以下界面。

PL02

4.此时到 http://windows.php.net/downloads/releases/php-7.0.8-Win32-VC14-x64.zip 下载PHP 7.0.8 x64 版本(也可以选择支持32位,只要将链接中的 x64 换成 x86 即可)。

5.解压PHP到适当的目录,并将 vcruntime140 (64位)这个文件下载并解压到 php 目录当中。

6.回到 Plume 管理器,点击“站点管”理然后点击“添加”。

PL03

7.按照旁边的要求填写网站信息。

绑定域名:单机可以使用 127.0.0.1 , localhost 等,按照实际情况填写。

站点目录:存放网站文件的文件夹位置,末尾不带“\”

默认文档,填写 index.php

执行权限,填写 ExecCGI

CGI 文件映射填写 .php

CGI 程序地址,填写 [PHP的目录]\php-cgi.exe  。如下图:

PL04

点击保存。

8.此时,点击服务状态,然后点击启动。如果显示正在运行,那么此时 PHP 的最简单的运行环境就已经搭建成功。(推荐参考本文末尾备注,修改一下 php.ini)

9.在站点目录新建一个 index.php,使用记事本(Notepad++ 等各种编辑器)编辑,

输入:

<?php phpinfo(); ?>

然后保存。

PL05

10.打开浏览器,输入网站地址(比如 127.0.0.1),如果看到 PHP 信息的话,恭喜你,成功搭建了PHP基本运行环境。

PL06

备注:

如果想要支持 MySQL 等额外功能,你还应该去下载 MySQL Server 并安装好并修改 php.ini。

本文出于简单方便的目的,没有介绍 php.ini 的修改(使用默认配置)。

如果需要,请将 php 目录里的 php.ini-development 改名为 php.ini。

打开 php.ini ,搜索 “extension_dir”,如果前面有分号,请去掉,并改成:

extension_dir = "ext"

搜索 "Windows Extensions"

在下面依次去掉  php_bz2.dll , php_curl.dll , php_gd2.dll , php_mbstring.dll , php_mysqli.dll 最前面的分号,保存即可。

看到高考状元的心声,内心一痛。

今天,看了某地一位高考状元在博客发布的文章。我也不想说什么非常震惊、伤心落泪这类虚伪的词。

只是,心好痛。作为一名江苏高考的落榜考生,我也有理想,我也想奉献社会。

当然,这篇文章不是我想表达羡慕或者是同情之情。也许,我是悲观主义者,我也是个内向的人,不擅长表达。我缺乏男孩子那种刚强果断、爱疯玩、热爱运动。

我喜爱电脑,也爱看动漫。我几乎不玩游戏,也因此总是和班级里其他学生没有什么共同的话题。

可能是我性格的孤僻,我觉得自己能静下心来看这个模式化运行的世界。曾几何时,我在期盼,在等待。我观望着,为什么二次元中那种理想的生活,理想的世界迟迟不能到来?

二次元一次次的冲击三次元的痛点,我们能也仅能做到叹一口气世俗,你究竟要如何继续作弄下去?

从古至今,无数伟人作家通过文字表达了痛惜之情,对世俗的厌恶,以及呼吁人们的觉醒。作为学生,这类文章我们经常能够在课堂上学习到。

老师告诉我们,我也一次次在试卷上答道 “1.社会的冷酷无情,2.人心的冷漠,3.主人公缺乏反抗精神”。我们学生在老师的带领下一次次的批判反驳旧时的社会,但我发现,过去的这些悲剧,不过是换了一个场合,其实依然时刻发生在身边。而我们,就是上演新话剧的傀儡。人在世俗个改造下终于变得世俗,开始继续改造下一代。

我不想远离社.会,偶然间这位状元的心声再次刺中了我。

感想

我不想反.抗,也无力这么做。只是,我不甘愿这样坠入世.俗无以自拔。

我希望,这个世界,能够多一份尊重,多一份感动。如是而已。

iEdon Inside.

2016-07-04 17:28:07

[16-04-22] 博客修复小记

博客因为服务器故障停止正常运行已有了很长一段时间。给大家带来不便,iEdon 在这里表示诚挚的歉意。

原因分析

主要故障原因是 Linux 下 MySQL 无法正常启动。其表现在:

1.MySQL Fork 出很多的工作进程,吃光了服务器的内存。

2.WordPress 系统无法建立到 MySQL Server 的连接。

3.MySQL 服务正常运行,但是一旦有连接建立就陷入假死。

4.每次配置完服务器总会表现的非常正常,问题总是在我上学几天后开始出现,这使得排查问题困难。

4.注:MySQL 的配置文件是正常的。

因此,鉴于自身能力的不足,决定使用稍旧版本的数据库系统以及使用 Windows OS,并且未来考虑弃用 MySQL&MariaDB。

目前经过设置和优化,使用了 Windows Apache + Adapted MySQL Server 作为生产环境,启用 HTTP/2.0 with Full-Site SSL。

iEdon 经过一段时间观察,运行良好。

优化心得

在设置优化的过程中,iEdon 遇到了如下的问题,Windows + Apache + MySQL + PHP 7 的运转效能不行,执行PHP页面需要 1.0-1.5 sec 之长。这比 PHP 5.6 还要慢 80%-100%

查阅网络帮助并分析出问题所在:

在 OS 的 Hosts 本地DNS解析文件中,并没有 localhost 到 127.0.0.1 的映射。阿里云提供了一个 loopback 的环回接口,那么这个接口很有可能是提供本地环回的。这个接口被我删掉了。PHP 在解析 localhost 时遇到解析超时,造成脚本解析缓慢。

因此解决办法就是在 Hosts 中加入 localhost 到 127.0.0.1 映射的规则即可。

已升级 PHP7.0.0 正式版 x64,然并卵

已经升级了 PHP7.0.0 作为生产环境,然而并没有什么乱用

感觉和 PHP 5.6.x 速度差不多。不知道吹嘘出来的 “Twice Faster Than PHP5.6.x” 体现在什么地方.......

测试环境:

Cloud Windows with PHP7.0.0 x64

WordPress 4.3.1 工作正常

插件 Configure SMTP 因为 PHP7 的新型变量定义,而出现了声明问题,目前没有时间研究。博客的邮件回复也因此失效。替代方法已纳入日程,目前没有时间更新。

另外,数学太难了!江苏数学更难!你够了!