- 博客(3)
- 资源 (25)
- 收藏
- 关注
第三方第四方易支付源码.rar
集成第三方/第四方易支付源码,自带3套模板任意切换,美化后台模板,集成多套模板的易支付源码,包含本站美化的后台模板,完美可用。
官方演示站点(标准易支付接口,仅供本站程序对接支付测试使用):http://epay.winds.fun
2020-09-16
盒子云支付2020特别开源版vPro_373.rar
盒子云易支付2020开源特别版vPro多通道多主题配色云支付源码 开源无加密,特色功能支持QQ防红、推广返利、主题多配色可选,通道默认支持支付宝、微信、QQ钱包、财付通、微信支付H5、当面付、码支付等 tips:版本开源,代码略显粗糙
2020-09-16
Zabbix php分布式系统监视 v5.0.3
Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
Zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供柔软的通知机制以让系统管理员快速定位/解决存在的各种问题。
Zabbix由2部分构成,Zabbix server与可选组件Zabbix agent。
Zabbix server可以通过SNMP,Zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux, Solaris, HP-UX, AIX, Free BSD, Open BSD, OS X等平台之上。
Zabbi
2020-09-16
贝云cms(bycms)付费内容内容管理系统
贝云cms(bycms)付费内容管理系统是一套基于thinkphp5.0.11,包含文章,图片,下载,视频模型,旨在帮助开发者节约web应用后台开发时间和精力,以最快的速度开发出高质量的web应用。包含pc端,手机端,微信端,安卓app,苹果app,多端数据同步!
主要特性:
基于tp5.0.9,可无缝升级之5.0.10,遵循PSR-2、PSR-4规范,Composer及单元测试,异常严谨的错误检测和安全机制,详细的日志信息,为你的开发保驾护航;减少核心依赖,扩展更灵活、方便,支持命令行指令扩展;出色的性能和REST支持、远程调试,更好的支持API开发;惰性加载,及路由、配置和自动加载的缓存
2020-09-16
虚拟商品自动发货系统(PHP).zip
发货100虚拟商品自动发货系统V1.0免费开源版是一款开源免费版本,MD5对比更新,支持自助升级;商家入驻、免登陆购买、免签支付、自动发货、付费阅读等。)
最近更新
[20190119] 修复:修复了免登录购买时选项卡切换错误的问题
[20190119] 修复:修复了子文件夹安装目录时找回密码链接错误的问题
[20190119] 新增:发货邮箱支持设置为商户自己的邮箱
[20190119] 修复:修复了部分XSS漏洞
[20190119] 修复:修复了在QQ浏览器兼容模式下购物出现的bug
[20190119] 新增:新增了商品/文章批发采购功能,方便新网站迅速填充内容
2020-09-16
最新响应式营销型H5万能官网系统PHP版.zip
响应式营销型万能H5建站系统,专为网络服务公司、建站公司、威客、站长、设计师、网络运营及营销人员打造,是一款响应式,多功能,高度自定义、无需编程、免费开源的超级建站利器,你可以用她打造自己的建站品牌。
基于MVC框架PHP语言开发,拥有完善的网站前台和后台全智能化管理功能,完全由后台操作(如添加、修改网站基本信息、产品、企业新闻动态、自媒体动态等。)
三网合一:一套系统,全网通用,完美适用PC
2020-06-14
2020年最新PHP微信朋友圈广告植入源码.zip
2020年最新PHP微信朋友圈广告植入源码,支持代理系统,自动植入文章广告管理!!!亲测可用!!最新PHP微信朋友圈广告植入源码
2020-01-10
全国省市县数据表微信小程序sql,2019年12月最新整理.sql
公司开发微信小程序,需要用到省市县,但是数据库中的省市县和微信小程序的有区别,所以重新整理和微信小程序一样的省市县数据,此文件为.sql文件,本人通过大量对比,目前没发现不同的地方
2019-12-21
2019年一步一幕炫酷搞笑在线生成微信源码.zip
无需数据库,流量数据大的推广方式
2019年一步一幕炫酷搞笑在线生成微信源码
2019年一步一幕炫酷搞笑在线生成微信源码
2019年一步一幕炫酷搞笑在线生成微信源码
2019-10-09
2019年最新微信裂变红包游戏源码 PHP拆红包源码 强制分享朋友圈分享群@mv.tiantianwen.top.zip
2019年最新微信裂变红包游戏源码 PHP拆红包源码 强制分享朋友圈分享群@mv.tiantianwen.top
2019-10-09
`DuckChat` 是一款即时通讯解决方案,用以搭建安全的私有聊天软件服务,可以帮你拥有一套自己的微信、钉钉等类似的移动社交产品。
# [DuckChat](http://duck.chat)
> `私有部署,保证信息安全` - `长链接、大集群,支持500+服务器`
>
> `也支持单机部署,非常灵活` - `iOS、Android、Web全端支持`
## 当前版本(1.0-beta-6)
> **向我们提问、反馈问题**
>
安装与使用教程:https://duckchat.akaxin.com/wiki/
## 简介
`DuckChat` 是一款即时通讯解决方案,用以搭建安全的私有聊天软件服务,可以帮你拥有一套自己的微信、钉钉等类似的移动社交产品。
因服务器掌握在自己手里,在获取便利的同时,还同时拥有对自己数据、业务的`100%`可控权,防止企业商业机密泄漏等。
**适用场景**
- 1️⃣ `企业内部办公聊天`
- 2️⃣ `精英用户私有聊天`
- 3⃣️ `内网社交软件,如校园漂流瓶等`
- 4⃣️ `将已有站点快速移动化,如Discuz、Wordpress等`
## 功能特性
**
2018-10-23
ThinkPHP3.2 集成 php-resque: PHP Resque Worker
ThinkPHP3.2 集成 php-resque: PHP Resque Worker
===========================================
php-resque是php环境中一个轻量级的队列服务。具体队列服务是做什么用的,请自行百度!
## 运行环境 ##
* PHP 5.2+
* Redis 2.2+
## 集成方法 ##
### 将源码放到ThinkPHP的Vendor目录中 ###
将源码更新到 ThinkPHP/Library/Vendor/php-resque/ 目录中
<font color=red>注意要定义应用目录,之前发的内容没定义应用目录导致部分小伙伴引发了找不到Queue类的异常</font>
### 在项目根目录中创建resque入口脚本 ###
#!/usr/bin/env php
<?php
ini_set('display_errors', true);
error_reporting(E_ERROR);
set_time_limit(0);
// 定义应用目录
define('APP_PATH','./Application/');
define('MODE_NAME', 'cli'); // 自定义cli模式
define('BIND_MODULE', 'Home'); // 绑定到Home模块
define('BIND_CONTROLLER', 'Queue'); // 绑定到Queue控制器
define('BIND_ACTION', 'index'); // 绑定到index方法
// 处理自定义参数
$act = isset($argv[1]) ? $argv[1] : 'start';
putenv("Q_ACTION={$act}");
putenv("Q_ARGV=" . json_encode($argv));
require './ThinkPHP/ThinkPHP.php';
### 创建Queue控制器 ###
在`Home`模块的`Controller`中创建`Queue`控制器
<?php
namespace Home\\\\\\\\Controller;
if (!IS_CLI) die('The file can only be run in cli mode!');
use Exception;
use Resque;
/***
* queue入口
* Class Worker
* @package Common\\\\\\\\Controller
*/
class QueueController
{
protected $vendor;
protected $args = [];
protected $keys = [];
protected $queues = '*';
public function __construct()
{
vendor('php-resque.autoload');
$argv = json_decode(getenv('Q_ARGV'));
foreach ($argv as $item) {
if (strpos($item, '=')) {
list($key, $val) = explode('=', $item);
} else {
$key = $val = $item;
}
$this->keys[] = $key;
$this->args[$key] = $val;
}
$this->init();
}
/**
* 执行队列
* 环境变量参数值:
* --queue|QUEUE: 需要执行的队列的名字
* --interval|INTERVAL:在队列中循环的间隔时间,即完成一个任务后的等待时间,默认是5秒
* --app|APP_INCLUDE:需要自动载入PHP文件路径,Worker需要知道你的Job的位置并载入Job
* --count|COUNT:需要创建的Worker的数量。所有的Worker都具有相同的属性。默认是创建1个Worker
* --debug|VVERBOSE:设置“1”启用更啰嗦模式,会输出详细的调试信息
* --pid|PIDFILE:手动指定PID文件的位置,适用于单Worker运行方式
*/
private function init()
{
$is_sington = false; //是否单例运行,单例运行会在tmp目录下建立一个唯一的PID
// 根据参数设置QUEUE环境变量
$QUEUE = in_array('--queue', $this->keys) ? $this->args['--queue'] : '*';
if (empty($QUEUE)) {
die("Set QUEUE env var containing the list of queues to work.\n");
}
$this->queues = explode(',', $QUEUE);
// 根据参数设置INTERVAL环境变量
$interval = in_array('--interval', $this->keys) ? $this->args['--interval'] : 5;
putenv("INTERVAL={$interval}");
// 根据参数设置COUNT环境变量
$count = in_array('--count', $this->keys) ? $this->args['--count'] : 1;
putenv("COUNT={$count}");
// 根据参数设置APP_INCLUDE环境变量
$app = in_array('--app', $this->keys) ? $this->args['--app'] : '';
putenv("APP_INCLUDE={$app}");
// 根据参数设置PIDFILE环境变量
$pid = in_array('--pid', $this->keys) ? $this->args['--pid'] : '';
putenv("PIDFILE={$pid}");
// 根据参数设置VVERBOSE环境变量
$debug = in_array('--debug', $this->keys) ? $this->args['--debug'] : '';
putenv("VVERBOSE={$debug}");
}
public function index()
{
$act = getenv('Q_ACTION');
switch ($act) {
case 'stop':
$this->stop();
break;
case 'status':
$this->status();
break;
default:
$this->start();
}
}
/**
* 开始队列
*/
public function start()
{
// 载入任务类
$path = COMMON_PATH . "Job";
$flag = \FilesystemIterator::KEY_AS_FILENAME;
$glob = new \FilesystemIterator($path, $flag);
foreach ($glob as $file) {
if('php' === pathinfo($file, PATHINFO_EXTENSION))
require realpath($file);
}
$logLevel = 0;
$LOGGING = getenv('LOGGING');
$VERBOSE = getenv('VERBOSE');
$VVERBOSE = getenv('VVERBOSE');
if (!empty($LOGGING) || !empty($VERBOSE)) {
$logLevel = Resque\Worker::LOG_NORMAL;
} else {
if (!empty($VVERBOSE)) {
$logLevel = Resque\Worker::LOG_VERBOSE;
}
}
$APP_INCLUDE = getenv('APP_INCLUDE');
if ($APP_INCLUDE) {
if (!file_exists($APP_INCLUDE)) {
die('APP_INCLUDE (' . $APP_INCLUDE . ") does not exist.\n");
}
require_once $APP_INCLUDE;
}
$interval = 5;
$INTERVAL = getenv('INTERVAL');
if (!empty($INTERVAL)) {
$interval = $INTERVAL;
}
$count = 1;
$COUNT = getenv('COUNT');
if (!empty($COUNT) && $COUNT > 1) {
$count = $COUNT;
}
if ($count > 1) {
for ($i = 0; $i < $count; ++$i) {
$pid = pcntl_fork();
if ($pid == -1) {
die("Could not fork worker " . $i . "\n");
} // Child, start the worker
else {
if (!$pid) {
$worker = new Resque\Worker($this->queues);
$worker->logLevel = $logLevel;
fwrite(STDOUT, '*** Starting worker ' . $worker . "\n");
$worker->work($interval);
break;
}
}
}
} // Start a single worker
else {
$worker = new Resque\Worker($this->queues);
$worker->logLevel = $logLevel;
$PIDFILE = getenv('PIDFILE');
if ($PIDFILE) {
file_put_contents($PIDFILE, getmypid()) or
die('Could not write PID information to ' . $PIDFILE);
}
fwrite(STDOUT, '*** Starting worker ' . $worker . "\n");
$worker->work($interval);
}
}
/**
* 停止队列
*/
public function stop()
{
$worker = new Resque\Worker($this->queues);
$worker->shutdown();
}
/**
* 查看某个任务状态
*/
public function status()
{
$id = in_array('--id', $this->keys) ? $this->args['--id'] : '';
$status = new \Resque\Job\Status($id);
if (!$status->isTracking()) {
die("Resque is not tracking the status of this job.\n");
}
echo "Tracking status of " . $id . ". Press [break] to stop.\n\n";
while (true) {
fwrite(STDOUT, "Status of " . $id . " is: " . $status->get() . "\n");
sleep(1);
}
}
}
### 新增队列配置 ###
在公共`config.php`中新增队列配置,如下
/* 消息队列配置 */
'QUEUE' => array(
'type' => 'redis',
'host' => '127.0.0.1',
'port' => '6379',
'persistent' => false, //是否启用
'prefix' => 'queue',
'password' => '', // 密码
),
### 新增队列初始化行为 ###
在`app_init`行为中新增队列初始化的行为,`run`内容为
public function run()
{
// 处理队列配置
$config = C('QUEUE');
if ($config) {
vendor('php-resque.autoload');
// 初始化队列服务
$select = isset($config['select']) ? $config['select'] : 0;
$password = isset($config['password']) ? $config['password'] : null;
$persistent = isset($config['persistent']) ? $config['persistent'] : false;
$timeout = isset($config['timeout']) ? $config['timeout'] : 30;
$server = $config['host'] . ":" . $config['port'];
\Resque::setBackend($server, $select, $password, $persistent, $timeout);
// 初始化缓存前缀
if(isset($config['prefix']) && !empty($config['prefix'])){
\Resque\Redis::prefix($config['prefix']);
}
}
}
到此,整个队列服务基本已配置完成。
接下来就要创建队列执行的任务了
## Jobs ##
### 创建 Jobs ###
目前任务类固定在`Common`模块的`Job`中,命名格式为`XxxxJob.class.php`
<?php
namespace Common\Job;
class XxxxJob
{
public function perform()
{
$args = $this->args;
fwrite(STDOUT, json_encode($args) . PHP_EOL);
}
}
要获取队列中传入的参数值请使用`$this->args`
任务perform方法中抛出的任何异常都会导致任务失败,所以在写任务业务时要小心,并且处理异常情况。
任务也有`setUp`和`tearDown`方法,如果定义了一个`setUp`方法,那么它将在`perform`方法之前调用,如果定义了一个`tearDown`方法,那么它将会在`perform`方法之后调用。
<?php
namespace Common\Job;
class XxxxJob
{
public function setUp()
{
// ... Set up environment for this job
}
public function perform()
{
// .. Run job
}
public function tearDown()
{
// ... Remove environment for this job
}
}
### 添加任务到队列中 ###
在程序控制器的任意方法中引入队列类库时,使用`Resque::enqueue`方法执行入栈,`Resque::enqueue`方法有四个参数,第一个是当前的队列名称,第二个参数为任务类,第三个是传入的参数,第四个表示是否返回工作状态的令牌
vendor('php-resque.autoload'); // 引入队列类库
$job = '\\Common\\Job\\XxxxJob'; // 定义任务类
// 定义参数
$args = array(
'time' => time(),
'array' => array(
'test' => 'test',
),
);
// 入栈
$jobId = \Resque::enqueue('default', $job, $args, true);
echo "Queued job ".$jobId."\n\n";
如果要查看当前任务的工作状态可以使用如下方法:
$status = new \Resque\Job\Status($jobId);
echo $status->get(); // Outputs the status
任务的工作状态值有专门的常量``\Resque\Job\Status``对应类。
具体的对应关系如下:
* `Resque\Job\Status::STATUS_WAITING` - 任务在队列中
* `Resque\Job\Status::STATUS_RUNNING` - 任务正在运行
* `Resque\Job\Status::STATUS_FAILED` - 任务执行失败
* `Resque\Job\Status::STATUS_COMPLETE` - 任务执行完成
* `false` - 无法获取状态 - 检查令牌是否有效?
任务的过期时间为任务完成后的24小时后,也可以定义过期类的`stop()`方法
## 队列任务启动 ##
在命令行中转到项目根目录,执行
$ php resque start
即可启动服务
启动时也可以加入部分参数:
* `--queue` - 需要执行的队列的名字,可以为空,也可以多个以`,`分割
* `--interval` -在队列中循环的间隔时间,即完成一个任务后的等待时间,默认是5秒
* `--count` - 需要创建的Worker的数量。所有的Worker都具有相同的属性。默认是创建1个Worker
* `--debug` - 设置“1”启用更啰嗦模式,会输出详细的调试信息
* `--pid` - 手动指定PID文件的位置,适用于单Worker运行方式
如:
$ php resque start --queue=default --pid=/tmp/resque.pid --debug=1
如果要使用守护进程方式启动则需要在最后加入`&`即可
如:
$ php resque start --queue=default --pid=/tmp/resque.pid --debug=1 &
也可以配合supervisord实现进程长驻
更多的操作请参考php-resque官方文档。
2018-10-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人