被泡尖海葵包围的刺颊海葵鱼,米尔恩湾,巴布亚新几内亚 (© Fred Bavendam/Nature Picture Library)

Welcom to 评论 - lizhenqiu blog!

    #362

    作者:广西南宁市
    js中对String去空格
    str为要去除空格的字符串:
    去除所有空格:
    str = str.replace(/\s+/g,"");
    Run code
    Cut to clipboard
      #,广西南宁市,2019-03-24,15:34:57, PHP保留两位小数的几种方法
      $num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 echo round($num,2); //10.46 //第二种:利用sprintf格式化字符串 $format_num = sprintf("%.2f",$num); echo $format_num; //10.46 //第三种:利用千位分组来格式化数字的函数number_format() echo number_format($num, 2); //10.46 //或者如下 echo number_format($num, 2, '.', ''); //10/46
      Run code
      Cut to clipboard
        文章:Laravel Npm Node  发表时间:2019-03-24, 15:34:37  
        展开↯

        #363

        作者:广西南宁市
        iview 表格(table) 里使用图片(img)
        { title: '头像', key: 'avatar', columns: { 'width':'50px' }, render: (h, params) => { return h('div', [ h('img', { attrs: { src: params.row.avatar }, style: { width: '40px', height: '40px' } }), ]); } },
        Run code
        Cut to clipboard
          不要使用props,这种的需要使用attrs!
          文章:Laravel Npm Node  发表时间:2019-03-19, 16:16:00  
          展开↯

          #364

          作者:广西南宁市
          文章:@意见反馈/技术支持/伊网/安企网  发表时间:2019-02-27, 11:59:20  
          展开↯

          #365

          作者:广西南宁市

          CentOS 7 设置 svn 开机启动

          找到 svn 的 service 配置文件 /etc/sysconfig/svnserve 编辑配置文件
          vi /etc/sysconfig/svnserve
          Run code
          Cut to clipboard
            将 OPTIONS="-r /var/svn" 改为 svn 版本库存放的目录,:wq 保存退出
            在提示符下输入
            systemctl enable svnserve.service
            Run code
            Cut to clipboard
              重启服务器,输入
              ps -aux | grep 'svn'
              Run code
              Cut to clipboard
                看 svn 服务启动了没有
                #,广西南宁市,2019-02-25,15:12:22, Linux开机自动挂载存储
                修改/etc/fstab文档
                vi /etc/fstab
                Run code
                Cut to clipboard

                  把要挂载的盘信息加到里面
                  /dev/emcpowerb1 /oracle/oradata ext3 defaults 0 0
                  Run code
                  Cut to clipboard
                    保存退出,等重启服务器就可以生效了
                    #,广西南宁市,2019-02-25,15:14:30,
                    本身目录下运行 sh test.sh
                    Run code
                    Cut to clipboard
                      文章:Linux系统中svn服务器设置开机启动  发表时间:2019-02-25, 15:10:08  
                      展开↯

                      #366

                      作者:广西河池市

                      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  
                        展开↯

                        #367

                        作者:广西南宁市
                        微信小程序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  
                            展开↯

                            #368

                            作者:广西河池市
                            检查是否已经有svn svnserve --version 安装 yum install -y subversion 检查安装是否成功 同样用的是 svnserve –version成功安装会显示版本信息 svnserve --version
                            Run code
                            Cut to clipboard
                              文章:Linux系统中svn服务器设置开机启动  发表时间:2019-02-16, 14:43:00  
                              展开↯

                              #369

                              作者:广西河池市

                              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  
                                展开↯

                                #370

                                作者:广西南宁市
                                vue编译错误
                                在使用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
                                            #,广西南宁市,2019-02-11,18:10:31, mysql随机获取一条或者多条数据
                                            语句二: 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  
                                              展开↯

                                              #371

                                              作者:广西
                                              后来,南山的风吹散了谷堆,北海的水淹没了墓碑,你应该仔细看我一眼,我又有几分像从前,我这般爱闹的性子,终究也被打磨成,如今的沉默寡言。
                                              #,广西,2019-02-03,08:42:37, 再后来南山的谷堆被重新堆起,北海的墓碑也再次重建。从前的日子回不去了就是回不去了。余生还长,日子还在,又何必慌张。
                                              文章:成功的故事只能倒叙着讲  发表时间:2019-02-03, 08:41:33  
                                              展开↯

                                              #372

                                              作者:广西南宁市

                                              小程序使用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
                                                3、GatewayWorker下的修改,用了nginx就不需要在此处使用ssl了,文档有提到 https://www.kancloud.cn/walkor/workerman/315297

                                                $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  
                                                  展开↯

                                                  #373

                                                  作者:广西南宁市
                                                  <?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
                                                    #,广西南宁市,2019-01-16,16:12:47,
                                                    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  
                                                        展开↯

                                                        #374

                                                        作者:黑龙江省哈尔滨市
                                                        文章:yourphp后台密码次数限制Login_error_count  发表时间:2019-01-16, 14:57:39  
                                                        展开↯

                                                        #375

                                                        作者:广西南宁市
                                                        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  
                                                          展开↯

                                                          #376

                                                          作者:广西南宁市
                                                          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  
                                                            展开↯

                                                            #377

                                                            作者:广西南宁市
                                                            简单的开发实例

                                                            实例一、使用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
                                                                            #,广西南宁市,2019-01-04,08:43:55, 慎用composer update
                                                                            composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害。 因为 composer update 的逻辑是按照 composer.json 指定的扩展包版本规则,把所有扩展包更新到最新版本,注意,是 所有扩展包,
                                                                            Run code
                                                                            Cut to clipboard
                                                                              文章:Laravel 5.4 结合 Workerman 实现 TCP 长连接  发表时间:2019-01-02, 18:13:33  
                                                                              展开↯

                                                                              #378

                                                                              作者:广西南宁市
                                                                              linux svn更新到指定版本
                                                                              直接 svn up -r 2105 当前的工作版本就是版本2105了 但是注意,这时svn库中会并不会生成新的版本,下次在本地svn up之后,还是会回到之前的版本。
                                                                              Run code
                                                                              Cut to clipboard
                                                                                文章:GitHub代码管理代码托管  发表时间:2019-01-04, 08:40:43  
                                                                                展开↯

                                                                                #379

                                                                                作者:广西南宁市
                                                                                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  
                                                                                  展开↯

                                                                                  #380

                                                                                  作者:广西南宁市
                                                                                  <?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  
                                                                                    展开↯
                                                                                    你好,残忍屏蔽广告

                                                                                    确定要清除编辑框内容吗?

                                                                                    该删除操作将不可恢复。

                                                                                    删除 取消

                                                                                    激活Windows

                                                                                    转到"设置"以激活Windows。