#362
展开↯#363
作者:广西河池市
Nginx配置 Laravel 正常访问
在nginx.conf 里对应的server{}中配置如下代码
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$query_string;
}
然后 重启 systemctl restart nginx即可
Run code
Cut to clipboard
文章:Laravel Npm Node 发表时间:2019-02-23, 14:20:24
#364
作者:广西南宁市
微信小程序placeholder设置自定义颜色
<view class='inp'>
<input placeholder-class="phcolor" class="input-text" name="username" placeholder="测试placeholder" />
</view>
Run code
Cut to clipboard
.phcolor{
color: #18acff;
}
Run code
Cut to clipboard
文章:微信小程序自定义选项卡tabBar模板底部顶部导航 发表时间:2019-02-21, 15:06:14
#365
作者:广西河池市
检查是否已经有svn
svnserve --version
安装
yum install -y subversion
检查安装是否成功
同样用的是 svnserve –version成功安装会显示版本信息
svnserve --version
Run code
Cut to clipboard
文章:Linux系统中svn服务器设置开机启动 发表时间:2019-02-16, 14:43:00
#366
作者:广西河池市
CentOS7关闭/开启防火墙
添加
firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --add-port=1000-2000/tcp --permanent
重新载入
firewall-cmd --reload
查看
firewall-cmd --zone=public --query-port=80/tcp
删除
firewall-cmd --zone=public --remove-port=80/tcp --permanent
Run code
Cut to clipboard
文章:Linux系统中svn服务器设置开机启动 发表时间:2019-02-16, 14:32:36
#367
作者:广西南宁市
vue编译错误
修改
node_modules\laravel-mix\setup\webpack.config.js
注释掉
碰到的问题(Couldn't find preset "es2015" relative to directory)
MODULE BUILD FAILED: ERROR: COULDN’T FIND PRESET “ES2015” RELATIVE TO DIRECTORY
遇到这个问题的时候我们需要安装 babel-preset-es2015
#,广西南宁市,2019-02-11,18:10:31, mysql随机获取一条或者多条数据
在使用webpack2.x打包时,出现下面报错(Unexpected token name «i», expected punc «;»):
ERROR in app.js from UglifyJs
Unexpected token name «i», expected punc «;» [app.js:9461,13]
定位到的报错是:
function oneOf (value, validList) {
for (let i = 0; i < validList.length; i++) {//此行报错
if (value === validList[i]) {
return true;
}
}
return false;
}
看样子是UglifyJs压缩插件在遇到es6语法时出错了。但是项目中自己写的代码是有用babel编译的,上面报错的代码应该是来自vue的库。为什么这些代码没有经过babel编译后才执行UglifyJs压缩呢?
Run code
Cut to clipboard
修改
node_modules\laravel-mix\setup\webpack.config.js
注释掉
{
test: /\.jsx?$/,
//exclude: /(node_modules|bower_components)/,
loader: 'babel-loader' + Mix.babelConfig()
},
Run code
Cut to clipboard
碰到的问题(Couldn't find preset "es2015" relative to directory)
MODULE BUILD FAILED: ERROR: COULDN’T FIND PRESET “ES2015” RELATIVE TO DIRECTORY
遇到这个问题的时候我们需要安装 babel-preset-es2015
npm install babel-preset-es2015 --save-dev
Run code
Cut to clipboard
/*{
test: /iview.src.*?js$/,
loader: 'babel-loader'
},*/
{
test: /\.jsx?$/,
//exclude: /(node_modules|bower_components)/,
loader: 'babel-loader' + Mix.babelConfig()
}
Run code
Cut to clipboard
{
"private": true,
"scripts": {
"serve": "php artisan serve",
"apidoc": "apidoc -i app/Http/Controllers/Api/v2 -o public/docs",
"ide-helper": "php artisan ide-helper:generate",
"git-push": "git add -A && git commit -m 'no msg' && git push --progress 'origin' master:master",
"dev": "npm run development",
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch-poll": "npm run watch -- --watch-poll",
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"prod": "npm run production",
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"fix-memory-limit": "cross-env LIMIT=8096 increase-memory-limit"
},
"devDependencies": {
"axios": "^0.15.3",
"babel-loader": "^7.1.1",
"babel-preset-es2015": "^6.24.1",
"bootstrap-sass": "^3.3.7",
"cross-env": "^3.2.4",
"css-loader": "^0.26.4",
"element-ui": "^1.3.7",
"fastclick": "^1.0.6",
"increase-memory-limit": "^1.0.6",
"jquery": "^3.2.1",
"laravel-mix": "^0.12.1",
"lodash": "^4.17.4",
"stylus": "^0.54.5",
"stylus-loader": "^3.0.1",
"vue": "^2.4.2",
"vue-loader": "^11.3.4",
"vue-router": "^2.7.0",
"vue-style-loader": "^2.0.5",
"vue-template-compiler": "^2.4.2"
},
"dependencies": {
"chart.js": "^2.6.0",
"iview": "^2.0.0",
"vant": "^0.12.3",
"vue-chartjs": "^2.7.2",
"vue-github-badge": "^1.0.1",
"vue-html5-editor": "^1.1.1",
"vue-image-crop-upload": "^2.1.3",
"vue-quill-editor": "^2.2.6",
"vue-social-share": "^0.0.3",
"vuex": "^3.0.1"
}
}
Run code
Cut to clipboard
var mix = require('laravel-mix');
var production=0;
//282216
//284050
// npm run watch
// npm run production
if(production) Mix.babelConfig={
babelrc: false,
presets: [
['es2015'],
],
};
//复制图片资源
//mix.copy('resources/assets/images', 'public/images');
//生成vue页面js
mix
//.js('resources/assets/js/app.js', 'public/js/app.js')
.js('resources/assets/js/admin/main.js', 'public/js/admin.js')
//.js('resources/assets/js/api/main.js', 'public/js/api.js')
//.js('resources/assets/js/business/main.js', 'public/js/business.js')
.js('resources/assets/js/city/main.js', 'public/js/city.js');
//生成bootstrap样式文件
//mix.sass('resources/assets/sass/app.scss', 'public/css');
//配置webpack
mix.webpackConfig({
output: {
// 路由懒加载文件路径
chunkFilename: "js/build/[id].js?[hash:8]"
},
module: {
rules: [{
// 图片资源保存路径规则
test: /\.(png|jpe?g|gif)$/,
loaders: [
{
loader: 'file-loader',
options: {
name: path => {
// 自定义部分
try {
if (/\/resources\/assets\//.test(path)) {
var file = path.substring(path.indexOf('/resources/assets/') + '/resources/assets/'.length);
if (file) {
if (file.substring(0, 3) === 'js/') file = 'pages/' + file.substring(3);
if (file.substring(0, 7) === 'images/') file = file.substring(7);
return 'images/' + file + '?[hash:8]'
}
}
} catch (e) { }
// 系统定义部分
if (!/node_modules|bower_components/.test(path)) {
return 'images/[name].[ext]?[hash:8]';
}
return 'images/vendor/' + path
.replace(/\\/g, '/')
.replace(
/((.*(node_modules|bower_components))|images|image|img|assets)\//g, ''
) + '?[hash:8]';
},
publicPath: mix.config.options.resourceRoot
}
}
]
}, {
// 字体资源保存路径规则
test: /\.(woff2?|ttf|eot|svg|otf)$/,
loader: 'file-loader',
options: {
name: path => {
// 自定义部分
try {
if (/\/resources\/assets\//.test(path)) {
var file = path.substring(path.indexOf('/resources/assets/') + '/resources/assets/'.length);
if (file) {
if (file.substring(0, 3) === 'js/') file = 'pages/' + file.substring(3);
if (file.substring(0, 7) === 'fonts/') file = file.substring(7);
return 'fonts/' + file + '?[hash:8]'
}
}
} catch (e) { }
// 系统定义部分
if (!/node_modules|bower_components/.test(path)) {
return 'fonts/[name].[ext]?[hash:8]';
}
return 'fonts/vendor/' + path
.replace(/\\/g, '/')
.replace(
/((.*(node_modules|bower_components))|fonts|font|assets)\//g, ''
) + '?[hash:8]';
},
publicPath: mix.config.options.resourceRoot
}
}]
}
});
Run code
Cut to clipboard
语句二:
SELECT * FROM users AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(userId) FROM `users`)-(SELECT MIN(userId) FROM users))+(SELECT MIN(userId) FROM users)) AS userId) AS t2 WHERE t1.userId >= t2.userId ORDER BY t1.userId LIMIT 1
执 行该sql语句,用时0.031s,效率非常好。当把”LIMIT 1“改为了”LIMIT 100“ 随机取一百条记录,用时0.048s。可是就在此时问题出现了,发现结果好像不是随机的。为了验证结果,又执行了N次,的确不是随机的。问题出现 在”ORDER BY t1.userId“这里,按userId排序了。随机取一条记录还是不错的选择,多条就不行了啊。
---------分隔线------------------------------------
语句三:
SELECT * FROM users WHERE userId >= ((SELECT MAX(userId) FROM users)-(SELECT MIN(userId) FROM users)) * RAND() + (SELECT MIN(userId) FROM users) LIMIT 1
执行该sql语句,用时0.039s,效率也是非常好。接着把”LIMIT 1“改为了”LIMIT 10000“,用时0.063s。经过多次验证,得出的结果都是随机的。
---------分隔线------------------------------------
结论:随机获得一条记录,语句二是相当不错的选择,采用JOIN的语法比直接在WHERE中使用函数效率还是要高一些的。语句三也不错,随机获得多条记录的首选。
Run code
Cut to clipboard
文章:Laravel Npm Node 发表时间:2019-02-11, 10:43:38
#368
作者:广西
后来,南山的风吹散了谷堆,北海的水淹没了墓碑,你应该仔细看我一眼,我又有几分像从前,我这般爱闹的性子,终究也被打磨成,如今的沉默寡言。 #,广西,2019-02-03,08:42:37, 再后来南山的谷堆被重新堆起,北海的墓碑也再次重建。从前的日子回不去了就是回不去了。余生还长,日子还在,又何必慌张。
文章:成功的故事只能倒叙着讲 发表时间:2019-02-03, 08:41:33
#369
作者:广西南宁市
小程序使用wss
微信小程序wss地址不允许使用端口,于是就利用nginx转发。
1、nginx版本是需要大于1.3
2、nginx配置文件修改
upstream websocket {
server ip:端口; //转发
}
server {
listen 443;
server_name 域名;
ssl on;
ssl_certificate 证书;
ssl_certificate_key 证书;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location /wss {
access_log /usr/share/nginx/logs/https-websocket.log;
proxy_pass http://websocket/; # 代理到上面
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
rewrite /wss/(.*) /$1 break;
proxy_redirect off;
}
}
Run code
Cut to clipboard
$gateway = new Gateway("websocket://0.0.0.0:9993");
Run code
Cut to clipboard
4、小程序那直接使用这个url : wss://域名/wss
文章:Laravel 5.4 结合 Workerman 实现 TCP 长连接 发表时间:2019-01-17, 17:43:11
#370
作者:广西南宁市
<?php
namespace App\Console\Commands;
use Workerman\Worker;
use Illuminate\Console\Command;
class WorkermanCommand extends Command
{
private $server;
/**
* The name and signature of the console command.
*
* @var string
*/
//protected $signature = 'wk {action}';
protected $signature = 'workman {action} {--d}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Start a Workerman server.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
global $argv;
$action = $this->argument('action');
$argv[0] = 'wk';
$argv[1] = $action;
$argv[2] = $this->option('d') ? '-d' : '';
// php artisan workman start --d
switch ($action) {
case 'start':
$this->start();
break;
case 'stop':
break;
case 'restart':
break;
case 'reload':
break;
case 'status':
break;
case 'connections':
break;
}
}
private function start()
{
// 证书最好是申请的证书
$context = array(
// 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
'ssl' => array(
// 请使用绝对路径
'local_cert' => '/www/wdlinux/nginx/conf/cert/a.******.net-ca-bundle.crt', // 也可以是crt文件
'local_pk' => '/www/wdlinux/nginx/conf/cert/a.******.net.key',
'verify_peer' => false,
//'verify_peer_name' => false,
//'allow_self_signed' => true, //如果是自签名证书需要开启此选项
)
);
// 这里设置的是websocket协议(端口任意,但是需要保证没被其它程序占用)
$worker = new Worker("websocket://0.0.0.0:20002",$context);
// 设置transport开启ssl,websocket+ssl即wss
//$this->server->transport = 'ssl';
// 启动4个进程对外提供服务
$worker->count = 1;
$worker->uidConnections = array();
$handler = \App::make('App\Handlers\WorkermanHandler');
// 连接时回调
/*$worker->onWorkerStart = function($worker){
global $handler;
// 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
$inner_text_worker = new Worker('Text://0.0.0.0:5678');
$inner_text_worker->onMessage = [$handler, 'onMessage'];
$inner_text_worker->listen();
};*/
$worker->onConnect = [$handler, 'onConnect'];
// 收到客户端信息时回调
$worker->onMessage = [$handler, 'onMessage'];
// 进程启动后的回调
$worker->onWorkerStart = [$handler, 'onWorkerStart'];
// 断开时触发的回调
$worker->onClose = [$handler, 'onClose'];
// 运行worker
Worker::runAll();
}
}
Run code
Cut to clipboard
Input "php wk stop" to stop. Start success.
Run code
Cut to clipboard
<?php
namespace App\Console\Commands;
use Workerman\Worker;
use Illuminate\Console\Command;
class WorkermanCommand extends Command
{
private $server;
/**
* The name and signature of the console command.
*
* @var string
*/
//protected $signature = 'wk {action}';
protected $signature = 'workman {action} {--d}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Start a Workerman server.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
global $argv;
$action = $this->argument('action');
$argv[0] = 'wk';
$argv[1] = $action;
$argv[2] = $this->option('d') ? '-d' : '';
// php artisan workman start --d
switch ($action) {
case 'start':
$this->start();
break;
case 'stop':
break;
case 'restart':
break;
case 'reload':
break;
case 'status':
break;
case 'connections':
break;
}
}
private function start()
{
// 证书最好是申请的证书
$context = array(
// 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
'ssl' => array(
// 请使用绝对路径
'local_cert' => '/www/wdlinux/nginx/conf/cert/a.***.net-ca-bundle.crt', // 也可以是crt文件
'local_pk' => '/www/wdlinux/nginx/conf/cert/a.***.net.key',
'verify_peer' => false,
//'verify_peer_name' => false,
//'allow_self_signed' => true, //如果是自签名证书需要开启此选项
)
);
// 这里设置的是websocket协议(端口任意,但是需要保证没被其它程序占用)
$worker = new Worker("websocket://0.0.0.0:20002",$context);
// 设置transport开启ssl,websocket+ssl即wss
//$this->server->transport = 'ssl';
// 设置transport开启ssl
$worker->transport = 'ssl';
// 启动4个进程对外提供服务
$worker->count = 1;
$worker->uidConnections = array();
$handler = \App::make('App\Handlers\WorkermanHandler');
// 连接时回调
/*$worker->onWorkerStart = function($worker){
global $handler;
// 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
$inner_text_worker = new Worker('Text://0.0.0.0:5678');
$inner_text_worker->onMessage = [$handler, 'onMessage'];
$inner_text_worker->listen();
};*/
$worker->onConnect = [$handler, 'onConnect'];
// 收到客户端信息时回调
$worker->onMessage = [$handler, 'onMessage'];
// 进程启动后的回调
$worker->onWorkerStart = [$handler, 'onWorkerStart'];
// 断开时触发的回调
$worker->onClose = [$handler, 'onClose'];
// 运行worker
Worker::runAll();
}
}
Run code
Cut to clipboard
文章:Laravel 5.4 结合 Workerman 实现 TCP 长连接 发表时间:2019-01-16, 10:52:04
#372
作者:广西南宁市
laravel 调试模式及日志配置
1)调试模式和日志的配置都在 config/app.php 配置文件中
2)打开调试模式
'debug' => env('APP_DEBUG', true)
3)laravel的日志默认已经打开了(不可以关),我们可以修改一下日志的记录方式(默认 single 单文件记录)
'log' => env('APP_LOG', 'daily')
PS:日志的记录方式有 single, daily, syslog, errorlog
4)设置报错级别(避免生成过多日志)
'log_level' => env('APP_LOG_LEVEL', 'error')
PS:config/app.php 文件里默认是没这个配置项的,要自己加,可以使用的值还有 debug, info, notice, warning, error, critical, alert, emergency
Run code
Cut to clipboard
文章:Laravel Npm Node 发表时间:2019-01-08, 17:06:25
#373
作者:广西南宁市
linux用nohup在后台常驻运行php脚本
nohup php a.php &
这样即使退出了终端,a.php依然在后台运行。
Run code
Cut to clipboard
文章:Laravel 5.4 结合 Workerman 实现 TCP 长连接 发表时间:2019-01-04, 08:45:03
#374
作者:广西南宁市
简单的开发实例
实例一、使用HTTP协议对外提供Web服务
创建http_test.php文件(位置任意,能引用到Workerman/Autoloader.php即可,下同)
命令行运行(windows用户用 cmd命令行,下同)
测试
假设服务端ip为127.0.0.1
在浏览器中访问url http://127.0.0.1:2345
实例二、使用WebSocket协议对外提供服务
创建ws_test.php文件
命令行运行
测试
打开chrome浏览器,按F12打开调试控制台,在Console一栏输入(或者把下面代码放入到html页面用js运行)
实例三、直接使用TCP传输数据
创建tcp_test.php
命令行运行
测试:命令行运行 (以下是linux命令行效果,与windows下效果有所不同)
#,广西南宁市,2019-01-04,08:43:55, 慎用composer update
实例一、使用HTTP协议对外提供Web服务
创建http_test.php文件(位置任意,能引用到Workerman/Autoloader.php即可,下同)
<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
// 创建一个Worker监听2345端口,使用http协议通讯
$http_worker = new Worker("http://0.0.0.0:2345");
// 启动4个进程对外提供服务
$http_worker->count = 4;
// 接收到浏览器发送的数据时回复hello world给浏览器
$http_worker->onMessage = function($connection, $data)
{
// 向浏览器发送hello world
$connection->send('hello world');
};
// 运行worker
Worker::runAll();
Run code
Cut to clipboard
命令行运行(windows用户用 cmd命令行,下同)
php http_test.php
Run code
Cut to clipboard
测试
假设服务端ip为127.0.0.1
在浏览器中访问url http://127.0.0.1:2345
实例二、使用WebSocket协议对外提供服务
创建ws_test.php文件
<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
// 注意:这里与上个例子不同,使用的是websocket协议
$ws_worker = new Worker("websocket://0.0.0.0:2000");
// 启动4个进程对外提供服务
$ws_worker->count = 4;
// 当收到客户端发来的数据后返回hello $data给客户端
$ws_worker->onMessage = function($connection, $data)
{
// 向客户端发送hello $data
$connection->send('hello ' . $data);
};
// 运行worker
Worker::runAll();
Run code
Cut to clipboard
命令行运行
php ws_test.php start
Run code
Cut to clipboard
测试
打开chrome浏览器,按F12打开调试控制台,在Console一栏输入(或者把下面代码放入到html页面用js运行)
// 假设服务端ip为127.0.0.1
ws = new WebSocket("ws://127.0.0.1:2000");
ws.onopen = function() {
alert("连接成功");
ws.send('tom');
alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
alert("收到服务端的消息:" + e.data);
};
Run code
Cut to clipboard
实例三、直接使用TCP传输数据
创建tcp_test.php
<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
// 创建一个Worker监听2347端口,不使用任何应用层协议
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
// 启动4个进程对外提供服务
$tcp_worker->count = 4;
// 当客户端发来数据时
$tcp_worker->onMessage = function($connection, $data)
{
// 向客户端发送hello $data
$connection->send('hello ' . $data);
};
// 运行worker
Worker::runAll();
Run code
Cut to clipboard
命令行运行
php tcp_test.php start
Run code
Cut to clipboard
测试:命令行运行 (以下是linux命令行效果,与windows下效果有所不同)
telnet 127.0.0.1 2347
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
tom
hello tom
Run code
Cut to clipboard
composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害。
因为 composer update 的逻辑是按照 composer.json 指定的扩展包版本规则,把所有扩展包更新到最新版本,注意,是 所有扩展包,
Run code
Cut to clipboard
文章:Laravel 5.4 结合 Workerman 实现 TCP 长连接 发表时间:2019-01-02, 18:13:33
#375
作者:广西南宁市
linux svn更新到指定版本
直接
svn up -r 2105
当前的工作版本就是版本2105了
但是注意,这时svn库中会并不会生成新的版本,下次在本地svn up之后,还是会回到之前的版本。
Run code
Cut to clipboard
文章:GitHub代码管理代码托管 发表时间:2019-01-04, 08:40:43
#376
作者:广西南宁市
Vue中使用websocket的正确使用方法
<template>
<div class="test">
</div>
</template>
<script>
export default {
name : 'test',
data() {
return {
websock: null,
}
},
created() {
this.initWebSocket();
},
destroyed() {
this.websock.close() //离开路由之后断开websocket连接
},
methods: {
initWebSocket(){ //初始化weosocket
const wsuri = "ws://127.0.0.1:8080";
this.websock = new WebSocket(wsuri);
this.websock.onmessage = this.websocketonmessage;
this.websock.onopen = this.websocketonopen;
this.websock.onerror = this.websocketonerror;
this.websock.onclose = this.websocketclose;
},
websocketonopen(){ //连接建立之后执行send方法发送数据
let actions = {"test":"12345"};
this.websocketsend(JSON.stringify(actions));
},
websocketonerror(){//连接建立失败重连
this.initWebSocket();
},
websocketonmessage(e){ //数据接收
const redata = JSON.parse(e.data);
},
websocketsend(Data){//数据发送
this.websock.send(Data);
},
websocketclose(e){ //关闭
console.log('断开连接',e);
},
},
}
</script>
<style lang='less'>
</style>
Run code
Cut to clipboard
文章:Laravel 5.4 结合 Workerman 实现 TCP 长连接 发表时间:2019-01-04, 08:38:56
#377
作者:广西南宁市
<?php
namespace App\Console\Commands;
use Workerman\Worker;
use Illuminate\Console\Command;
class WorkermanCommand extends Command
{
private $server;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'wk {action}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Start a Workerman server.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
global $argv;
$arg = $this->argument('action');
$argv[1] = $argv[2];
$argv[2] = isset($argv[3]) ? "-{$argv[3]}" : '';
switch ($arg) {
case 'start':
$this->start();
break;
case 'stop':
break;
case 'restart':
break;
case 'reload':
break;
case 'status':
break;
case 'connections':
break;
}
}
private function start()
{
// 证书最好是申请的证书
$context = array(
// 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
'ssl' => array(
// 请使用绝对路径
'local_cert' => '/www/wdlinux/nginx/conf/cert/a.gengdian.net-ca-bundle.crt', // 也可以是crt文件
'local_pk' => '/www/wdlinux/nginx/conf/cert/a.gengdian.net.key',
'verify_peer' => false,
//'verify_peer_name' => false,
//'allow_self_signed' => true, //如果是自签名证书需要开启此选项
)
);
// 这里设置的是websocket协议(端口任意,但是需要保证没被其它程序占用)
$worker = new Worker("websocket://0.0.0.0:20002",$context);
// 设置transport开启ssl,websocket+ssl即wss
$this->server->transport = 'ssl';
// 启动4个进程对外提供服务
$worker->count = 1;
$worker->uidConnections = array();
$handler = \App::make('App\Handlers\WorkermanHandler');
// 连接时回调
$worker->onConnect = [$handler, 'onConnect'];
// 收到客户端信息时回调
$worker->onMessage = [$handler, 'onMessage'];
// 进程启动后的回调
$worker->onWorkerStart = [$handler, 'onWorkerStart'];
// 断开时触发的回调
$worker->onClose = [$handler, 'onClose'];
// 运行worker
Worker::runAll();
}
}
Run code
Cut to clipboard
文章:Laravel 5.4 结合 Workerman 实现 TCP 长连接 发表时间:2019-01-04, 08:38:06
#378
作者:广西南宁市
let与const的区别
let与const都是只在声明所在的块级作用域内有效。
let声明的变量可以改变,值和类型都可以改变,没有限制。
const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
let与const都是只在声明所在的块级作用域内有效。
let声明的变量可以改变,值和类型都可以改变,没有限制。
const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
文章:Laravel Npm Node 发表时间:2019-01-02, 16:54:12
#379
作者:广西南宁市
在用UPUPW部署laravel项目遇到的问题
添加虚拟主机之后,访问域名发现白屏,此时发现public下面其他文件均可访问,当时就懵逼了
解决方案:
说明服务器的
error信息没有被显示,可是之前通过http://localhost/blog/public是可以访问的!但是本人试过的确是这样,将
php.ini中的display_errors = Off 改为: display_errors = On, 访问可以看到空白页变成了出错信息的页面,看到如下错误信息:Warning: require(): open_basedir restriction in effect.
进入http.conf文件或者http.vhosts.conf文件的open_basedir的值修改,很多LAMP组件会默认将open_basedir设置为与网站根目录一致,但是laravel有点变态,这里必须设置为上级目录,即此处的blog目录。设置完毕之后,重启apache,错误终于消除了。
添加虚拟主机之后,访问域名发现白屏,此时发现public下面其他文件均可访问,当时就懵逼了
解决方案:
说明服务器的
error信息没有被显示,可是之前通过http://localhost/blog/public是可以访问的!但是本人试过的确是这样,将
php.ini中的display_errors = Off 改为: display_errors = On, 访问可以看到空白页变成了出错信息的页面,看到如下错误信息:Warning: require(): open_basedir restriction in effect.
进入http.conf文件或者http.vhosts.conf文件的open_basedir的值修改,很多LAMP组件会默认将open_basedir设置为与网站根目录一致,但是laravel有点变态,这里必须设置为上级目录,即此处的blog目录。设置完毕之后,重启apache,错误终于消除了。
文章:Laravel Npm Node 发表时间:2019-01-02, 16:52:16
#380
作者:广西南宁市
vue读取音频文件
methods: {
// 试听游戏音乐
muiscPlay1(){
this.gamemuiscs1 = new Audio("../../static/audio/"+this.valueOpt);
this.gamemuiscs1.play();
},
}
Run code
Cut to clipboard
文章:Laravel Npm Node 发表时间:2019-01-02, 09:43:03
CentOS 7 设置 svn 开机启动
找到 svn 的 service 配置文件 /etc/sysconfig/svnserve 编辑配置文件
vi /etc/sysconfig/svnserve
在提示符下输入
systemctl enable svnserve.service
ps -aux | grep 'svn'
修改/etc/fstab文档
vi /etc/fstab
把要挂载的盘信息加到里面
/dev/emcpowerb1 /oracle/oradata ext3 defaults 0 0
本身目录下运行 sh test.sh