分类目录归档:闲聊杂谈

Python虚拟环境安装

1.安装virtualenv和virtualenvwrapper

为什么要安装虚拟环境?

python的包默认是安装在全局的,两个不同的项目可能需要不同版本的python或,如果安装在一起可能会导致问题发生。而虚拟环境可以隔离多个python版本工具,相互独立,互不影响。

pip intsall virtualenv 
pip install virtualenvwrapper-win  //windows下
pip install virtualenvwrapper  //linux
2.常用命令
mkvirtualenv *envName*  //创建一个虚拟环境 创建在用户家目录下
workenon *envName*  //激活环境
rmvirtualenv *envName* //删除环境
deactivate  //退出环境
worken //列出环境
3.安装虚拟环境的包

需要进入虚拟环境中,执行pip install即可

4.pycharm配置
File->settings->project interperter->project interperter中选择虚拟环境的python.exe文件即可

Lua基础语法

#!/usr/bin/lua  –指定lua的解释器

–print(‘hello word!’) 单行注释

–[[
print(‘多行注释’);
–]]
–定义变量,默认所有变量都是全局的,除非把变量声明为局部 关键字 local
a = 1
–获取一个不存在的变量 返回 nil 删除一个变量直接把变量声明为nil即可
print(‘变量a:’..a)

print(b) –返回nil

a=nil
print(a) –nil

Laravel 5.6 中优雅的管理 swoole 进程

1. 创建自定义artisan命令
php artisan make:command SwooleManger //默认在app/Console/Commans目录下创建SwooleManger.php文件。

    <?php
    namespace App\Console\Commands;    
    use Illuminate\Console\Command;
    use Illuminate\Support\Facades\App;
    class SwooleManger extends Command
    {
        private $server;

        private $pid_file;
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'swoole {action}';

        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'start or stop the swoole process';

        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
            $this->pid_file =  __DIR__.'/../../../storage/swoole_websocket.pid';
        }

        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            //获取传递的操作
            $arg = $this->argument('action');

            switch ($arg){
                case 'start':
                    //检测进程是否已开启
                    $pid = $this->getPid();
                    if($pid && \Swoole\Process::kill($pid,0))
                    {
                        $this->error("\r\nprocess already exist!\r\n");
                        exit;
                    }

                    $this->server = new \swoole_websocket_server("0.0.0.0", 9501);
                    $this->server->set([
                        'worker_num'=>8,
                        'daemonize' =>1,
                        'max_request'=>1000,
                        'dispatch_mode'=>2,
                        'pid_file' =>$this->pid_file,
                    ]);

                    //绑定操作类回调函数
                    $app = App::make('App\Handles\SwooleWebSocketHandle');

                    $this->server->on('open',array($app,'onOpen'));

                    $this->server->on('message',array($app,'onMessage'));

                    $this->server->on('close',array($app,'onClose'));

                    $this->info("\r\nprocess created successful!\r\n");

                    $this->server->start();
                    break;

                case 'stop':
                    if(!$pid = $this->getPid())
                    {
                        $this->error("\r\nprocess not started!\r\n");
                        exit;
                    }
                    if(\Swoole\Process::kill((int)$pid))
                    {
                        $this->info("\r\nprocess close successful!\r\n");
                        exit;
                    }
                    $this->info("\r\nprocess close failed!\r\n");
                    break;

                default:
                    $this->error("\r\noperation method does not exist!\r\n");
            }

        }

        //获取pid
        private function getPid()
        {
            return file_exists($this->pid_file) ? file_get_contents($this->pid_file) :false;
        }
    }

以上命令定义完成可使用artisan来管理swoole websocket服务的开启和关闭

php artisan swoole start  //开启
php artisan swoole stop //关闭

2.使用Handles类来处理swoole的事件处理

//在SwooleManger中使用了 
$app = App::make('App\Handles\SwooleWebSocketHandle'); //将SwooleWebsocketHandle注入到SwooleManger中

使用$this->server->on 注册事件回调函数,创建App\Handles\SwooleWebSocketHandle文件实现webSocket的事件即可

Ubuntu14 安装php Swoole扩展

1.安装扩展前的准备工作:

  • 1.1 安装php,版本必须大于5.3.10

sudo apt-get install php5.6  扩展根据使用情况安装

  • 1.2 安装gcc,ubuntu自带,一般不需要安装

sudo apt-get  build-dep gcc

  • 1.3 安装 autoconf

sudo apt-get autoconf

  • 1.4 安装git

sudo apt-get git

  • 1.5 安装pcre

sudo apt-get install libpcre3 libpcre3-dev

2.下载Swoole扩展源码编译

  • 2.1 创建目录下载源码

mkdir swoole

cd swoole

sudo git clone -b v1.10.5 https://github.com/swoole/swoole-src.git    #指定分支 1.10.5

  • 2.2 切换到源码目录执行编译

cd swoole-src/  #需要权限

phpize【可能不存在 需要安装sudo apt-get install php5-dev】

./configure

make

sudo make install

  • 2.3 配置php.ini文件

extension=swoole.io

  • 2.4 查看模块是否正常开启

通过phpinfo() 来查看是否成功加载了swoole

debris

1.apache xSendFile支持

在我们提供文件下载、图片展示功能时,可能需要让php进行条件判断后(比如权限判断、扣除下载点数等),再循环读文件进行传输。这样做小文件还好,当遇到大文件时就会占用较多的内存资源,同时减慢了文件的传输速度。这个时候就需要xsendfile特性了,通过header发送xsendfile标记,可以直接把需要传输的文件直接交给web服务处理,大大减少了后台语言的资源占用,也加快了传输速度。

Ubuntu 安装xSendFile   sudo apt-get install libapache2-mod-xsendfile

xsendfile默认是关闭状态的,需要在virtual host(配置虚拟机的地方)添加两条指令

XSendFile on
XSendFilePath d:/xampp/file_path

xsendfilepath是必须配置的,因为如果不配置的话,php脚本只能调用当前及子目录的文件

脚本添加 header(‘X-Sendfile: filename.jpg’);

2.使用fsockopen实现异步调用方法

function post_socket()
{
    $fp = fsockopen("www.wenjunting.com", 80, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $arr = array('key'=>1,'name'=>'test');
        $encodeData = http_build_query($arr);

        $out = "POST /test.php HTTP/1.1\r\n";
        $out .= "Host: www.wenjunting.com \r\n";
        $out .= "Content-type: application/x-www-form-urlencoded\r\n";
        $out .= "Content-Length: ".strlen(trim($encodeData ))."\r\n";
        $out .= "Connection: Close\r\n\r\n";
        $out .= trim($data);
        fwrite($fp, $out);
       //忽略执行结果
      /* while (!feof($fp)) {
          echo fgets($fp, 128).'<br/>';
      }*/
      fclose($fp);
   }
}
更多异步方法

3.批量关闭Linux进程
 ps -ef|grep php|grep -v grep|awk '{print $2}'|xargs kill -INT  //xargs 将标准输出作为kill命令的参数


window 安装 nginx-1.8.3+php7.0+mysql5.7

1.下载nginx1.8 + php7.0 + mysql5.7.16

nginx 下载地址: http://nginx.org/en/download.html

php7.0 下载地址:http://windows.php.net/download#php-7.0   vc-x64 非线程安全

mysql5.7.16 下载地址: https://dev.mysql.com/downloads/mysql/  下载社区版zip包

2. 安装和配置 nginx1.8

解压nginx1.8的zip包到安装目录,配置conf/nginx.conf

 新增 .php文件为默认文件   

       location / {
            root   html;
            index  index.html index.htm inde.php;
        }
    开启文件gzip压缩
      gzip on;  #开启gzip压缩
      gzip_min_length 1k;  #设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大
      gzip_buffers 16 16k; #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。16 16k代表以16k为单位,安装原始数据大小以16k为单位的16倍申请内存。
      gzip_http_version 1.1; #识别http协议版本号
      gzip_comp_level 9; #文件压缩比  1-9 1 压缩比最小,处理速度最快  9压缩比最高处理速度慢,响应最快
      gzip_types  text/plain application/x-javascript text/css application/xml; #/匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。
      gzip_vary on; #和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
   设置fast-cgi 和 支持phpinfo
       location ~ \.php {
             set $path_info "";
             #定义变量 $real_script_name,用于存放真实地址
             set $real_script_name $fastcgi_script_name;
             #如果地址与引号内的正则表达式匹配
            if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
               #将文件地址赋值给变量 $real_script_name
                set $real_script_name $1;
               #将文件地址后的参数赋值给变量 $path_info
              set $path_info $2;
                 }
             root D:\www\safe;
             fastcgi_pass 127.0.0.1:9000;
             fastcgi_index index.php
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
             fastcgi_param PATH_INFO $path_info;
             fastcgi_param SCRIPT_NAME $real_script_name;
            include fastcgi_params;
        }
    备注:其他配置根据实际需要更改

3. php.ini 配置文件修改

修改php.ini-development文件,将文件名修改为php.ini,打开php配置文件php.ini,保存即可。

搜索“extension_dir”,找到: e;xtension_dir = “ext” 先去前面的分号再改为 extension_dir = “.\ext”

搜索“date.timezone”,找到:;date.timezone = 先去前面的分号再改为 date.timezone = PRC

搜索“enable_dl”,找到:enable_dl = Off 改为 enable_dl = On

搜索“cgi.force_redirect” ;cgi.force_redirect = 1 先去前面的分号再改为 cgi.force_redirect = 0

搜索“fastcgi.impersonate”,找到: ;fastcgi.impersonate = 1 去掉前面的分号

搜索“cgi.rfc2616_headers”,找到:;cgi.rfc2616_headers = 0 先去前面的分号再改为 cgi.rfc2616_headers = 1

   备注:其他配置项按需配置。

4. 使用其他工具启动php-cgi和nginx

 下载一个RunHiddenConsole.exe,开启php-cgi和nginx.exe,保存为run.bat     

RunHiddenConsole.exe的作用是在执行完命令行脚本后可以自动关闭脚本,而从脚本中开启的进程不被关闭。简单来说就是黑窗体(CMD命令窗体)不会显示,但CMD命令窗体中运行的程序不会被关闭。

          @echo off
          echo Starting PHP FastCGI...
          C:\php+nginx+mysql\RunHiddenConsole.exe C:\php+nginx+mysql\php\php-cgi.exe -b 127.0.0.1:9000 -c C:\php+nginx+mysql\php\php.ini
          echo Starting nginx...
          c\nginx\RunHiddenConsole.exe C:\php+nginx+mysql\nginx\nginx.exe -p C:\php+nginx+mysql\nginx

    关闭php-cgi和nginx.exe,保存为stop.bat   
         @echo off
         echo Stopping nginx...
         taskkill /F /IM nginx.exe > nul
         echo Stopping PHP FastCGI...
         taskkill /F /IM php-cgi.exe > nul
         exit

 

4. 安装mysql

解压mysql.zip包到安装目录

1. 设置环境变量path 的值   把mysql bin目录追加到path变量中

2.cmd以超级管理员运行,切换到mysql/bin目录,执行 mysqld –initialize-insecure 初始化无密码安装,执行完成生产data目录,运行错误需要安装vc++和 Microsoft DirectX 9 和 Microsoft DirectX 修复工具 修复

3.运行 mysqld –install 安装服务

4.配置my.ini文件(需先初始化安装在配置文件,且文件需要ansi格式编码,不能是utf-8或gbk

5. 启动 net start mysql

6 停止 net stop mysql

7.修改用户密码请参照: http://www.wenjunting.com/?p=68


					

使用Nginx实现反向代理与负载均衡

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

Nginx 反向代理的指令不需要新增额外的模块,默认自带 proxy_pass 指令,只需要修改配置文件就可以实现反向代理。

Nginx反向代理应用场景可以作为web服务器负载均衡的服务器,同时也可以作为一个代理服务器【一个公网ip对应多个站点做代理服务使用】

 

 

  1.   Nginx 实现反向代理

域名服务商—>绑定A记录到代理服务器–>代理服务器解析server_name->设置转发请求到指定服务器

upstream website{
server 192.168.1.254:81;   #内部服务器ip:port
}
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

root /usr/share/nginx/html;
index index.php index.html index.htm;   #目录下默认加载文件
# Make site accessible from http://localhost/
server_name 127.0.0.1;  #域名或ip

#通过访问service二级目录来访问后台
location /service/ {
#website后面的斜杠是一个关键,没有斜杠的话就会传递service到后端节点导致404
proxy_pass http://website/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

#其他路径默认访问前台网站
location / {
proxy_pass http://website;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

2. Nginx 实现负载均衡

……

 

关于微信硬件平台接口,微信链接精简协议设备的授权链接全过程

腾讯的开发文档实在太坑,不是我一个人,相信很多对于公众平台的人都有这样的经历。故特为此写一些东西。废话少说!马上开始微信链接设备的授权链接全过程。

一,在做这个之前,务必先有一个测试公众号或者一个认证的公众号。而且,你务必懂得如何接入微信公众号,如果未了解如何接入微信公众号的朋友,请先弄清接入微信公众号,再看此文。

二,添加蓝牙设备

1,登陆微信公众号。然后在左边的菜单栏找到《设备功能》;

2,点击《设备功能》后,在右的窗口找到《添加产品》,点击《添加产品》添加蓝牙设备,添加蓝牙设备的步骤如下:

(1),填写产品名称(你可以自行定义);

(2),选择接入方案,选择“平台基础”接入方案;

(3),产品描述(你可以自行定议描述);

(4),产品品类,选择“数码”->“智能数码”->”智能手环”;(我的是手环链接,故如此选择。你的可以根据你的产品实际情况另行选择);

(5),链接类型选择”蓝牙”;

(6),产品添加方式选择”每个产品唯一的二维码“;

(7),产品配置发现选择”蓝牙发现”;然后点击下一步;

(8),产品基础能力,选择”链接能力“->”蓝牙发现“;点击”添加“;即可实现添加蓝牙设备;

添加了蓝牙设备,并不是代表你可以使用蓝牙了,这是入坑的第一步。坑还很深,欲知后事,请继续关注!更新中……

mysql 5.7 主从同步配置(备份/读写分离)

一、配置需注意

在项目实际开发中,有时需要配置多台数据库服务器,如备份/读写分离,需要配置多台数据库服务器,这就需要数据库的主从同步了,配置前为保证系统运行良好,保障程序的健壮性,尽量要使用相同版本的mysql数据库。

二、Master主服务器配置

1.在Mysql 配置中添加如下配置

[mysqld]

server-id = 103  #server-id 服务器唯一标识,取主服务器的ip后缀

log_bin = master-bin   #启动MySQL二进制日志,名称可以随意命名

log_bin_index = master-bin.index

binlog_do_db = my_data #指定记录二进制日志的数据库

binlog_ignore_db = mysql #指定不记录二进制日志的数据库

 

2.登录主服务器MySQL创建从服务器用到的账户和权限:

grant replication slave on *.* to 'slave1' @'192.168.1.%' identified by '123456';

(192.168.1.%通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP,安全起见只指定一个ip)

 

3.重启MySQL,命令:

service mysql restart;

 

4.登录MySQL状态下,查看主服务器状态:(需其他帐号登录,不能使用配置备份的帐号)

show master status;
File               Position  Binlog_Do_DB     Binlog_Ignore_DB 
master-bin.000001   154       db_shop           mysql

三、Slave从服务器配置

1.编辑my.cnf

在[mysqld]中添加:

server-id = 2

relay-log = slave-relay-bin

relay-log-index = slave-relay-bin.index

 

2.重启Slave从服务器MySQL,命令:

 service mysql restart;

3. 登录Slave从服务器,连接Master主服务器:

change master to master_host='192.168.1.103',master_port=3306,master_user='masterbackup',master_password='masterbackup',master_log_file='master-bin.000001',master_log_pos=2403;

备注:master_host对应主服务器的IP地址,master_port对应主服务器的端口,master_log_file对应show master status显示的File列:master-bin.000001,master_log_pos对应Position列:154,否则有可能出现同步失败。

 

4.登录MySQL状态下,启动Slave数据同步。

start slave;

5.登录MySQL状态下,查看Slave信息:

show slave status\G;

信息中有两列: Slave_IO_Running 和 Slave_SQL_Running都为yes才表示同步成功。

6.登录MySQL状态下,停止同步命令:

stop slave;

四、从异常中恢复备份

1. 当从库停机或非正常故障时的解决方案,会使备份停止。这时再次启动备份会报错误:

 Slave failed to initialize relay log info structure from the repository

使用 reset slave命令重新定位日志文件;当reset slave成功就在执行start slave命令开启备份即可。

 

windows [server 2008]下 配置openssl 非对称加密的方法

  1. 配置环境变量:path变量,在path变量中添加php的路径,如c:/php;
  2. 新增环境变量OPENSSL_CONF,值为opensll.conf的路径,如:c:/php/ext/ssl/openssl.conf;
  3. openssl.conf是公钥和私钥的配置文件,php官方手册已经描述的很详细了,可以参考,在此不在赘述;
  4. 配置完这两项就可以重启服务器,写相关的秘钥生成代码;
  5. 由于生成秘钥的过程比较耗时的,所有建议生成N多组秘钥对在数据库中保存,需要的时候获取即可;
  6. 关于秘钥的加解密,需要根据项目的业务定义,接口传输数据时直接使用openssl扩展库的函数加密即可;
  7. 如果是前台数据加密可以使用这些JS库加密字符串
    <script src="./js/jsencrypt.js"></script>