分类 iTXTech 下的文章

SimpleFramework 2.2.0

计划于 12/01/2019 发布正式版本。

特性前瞻

  • 重新设计的 autoload.php,引入 iTXTech\SimpleFramework\Initializer

    • 支持手动加载 SimpleFramework
<?php

define("SF_LOADER_AUTO_INIT", false);//禁用自动 loadSimpleFramework

require_once "autoload.php";

use iTXTech\SimpleFramework\Initializer;

Initializer::loadSimpleFramework("sf.phar");
Initializer::initTerminal(true);
Initializer::setSingleThread(false);

//...
  • 模块热更新(Module HotPatch),基于 PECL Runkit7 扩展实现,例子见 README
  • 引入 sfloader.php 自动查找 SimpleFramework,无需一个项目一个SF了!

    • SF_HOME 环境变量指向 SimpleFramework 源码目录
    • SF_ARCHIVE 环境变量指向 SimpleFrameworkPHAR
  • 全新的 Curl ,且支持多个网络接口 InterfaceSelector,支持全局代理
  • 引入预加载 ./sf p=preload.php p=phar://a.phar/preload.php ....
  • 引入 Packer,支持自定义模块打包时行为
  • 模块打包支持自定义 stubsf.json中使用"stub": "stub.php"来定义)
  • 模块打包支持加入sfloader.phpinfo.json中使用"preload": true
  • 支持自动计算模块加载顺序,移除 order
  • 同时支持 sf.jsoninfo.json

更多特性(未实现)

  • 支持在模块中使用 composer 来管理包

由于项目需要,我们建立了某日本插画网站的全站作品和图片数据库。
利用php-phash为每张图片生成了唯一的标识码,通过计算汉明距离进行匹配。
那么有了这些数据之后,就应该开始搭建图片搜索引擎了。

数据量

  • 作品数:3700万左右
  • 空间:1.9TB
  • 数据库:MongoDB 4.0.3

前端

  • pixiv.FUN RiseFront - 可通过Redis缓存搜索结果,组织搜索队列
  • NGINX - 反向代理RiseFront

后端

  • Pifrise - 全称为pixiv.FUN Reverse Image Search Engine

    • 通过连接MongoDB初始化数据,以及作品信息
    • 接口为HTTP协议
    • 只支持全部搜索
    • Java
  • AoiHammer - 开源的汉明距离搜索引擎,通过本地文件初始化数据

    • 接口为TCP ANSI协议
    • 支持摘要搜索和全部搜索
    • C++

性能

  • Pifrise

    • i5-2300 3600w 900ms
    • E5645 x2 3650w 490ms
    • Mem: 6GB
  • AoiHammer

    • F i5-2300 3600w 100~200ms
    • S i5-2300 3600w 500ms
    • Mem: 8GB

iTXTech Rpf

是一个为 SimpleFramework 2.1swoole 4.2 设计的可扩展的反向代理框架

几行代码就能完成一个可用的反向代理

require_once "load_env.php";

use iTXTech\SimpleFramework\Console\Logger;
use iTXTech\Rpf\{Handler, Launcher};
use Swoole\Http\{Request, Response};
use Swoole\Coroutine\Http\Client;

Logger::info("Constructing");
$launcher = (new Launcher())
    ->listen("127.0.0.1", 80)
    ->handler(new class() extends Handler{
        public function ssl(bool $ssl){
            $this->ssl = true;
        }

        public function request(Request $request){
            Logger::info("Got request from " . $request->server["remote_addr"] . " to " .
                $request->header["host"] . $request->server["request_uri"]);
        }

        public function complete(Request $request, Response $response, string $body){
            Logger::info("Got response from " . $request->header["host"] . $request->server["request_uri"] .
                " len: " . strlen($body));
        }

        public function response(Request $request, Response $response, Client $client){
            $response->header["X-Powered-By"] = "iTXTech Rpf";
            $client->body .= "\n<!-- Powered by iTXTech Rpf --!>";
        }
    });

Loader::load($launcher);

开源协议

Copyright (C) 2018 iTX Technologies

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.