1. 1
  2. 2
  • 欢迎您
    Linux下主从配置过程
    yunitongxing 2019-05-29 技术语录

    15

    主从服务器基本原理:主从同步,分为两台服务器,如图:Master为主服务器,Slave为从服务器

    图片.png

    那么接下来让我们看看如何使用两台服务器搭建mysql的主从同步吧

    第一步,修改Master和Salve上的mysql的配置文件;

    a、修改主服务器(Master)的配置文件

    在my.cnf中,添加配置:server-id=1   log-bin=master-bin  log-bin-index=master-bin.index

    然后重启musql:service mysql restart

    最后登录mysql:mysql -u 用户名  -p 密码

    输入命令 show master status;图片.png

    b、在从服务器Slave,编辑my.cnf,同理添加配置:

    server-id=2   relay-log=slave-relay-bin   relay-log-index=slave-relay-bin.index

    同理重启MySQL,service mysql restart

    第二步:开始主从连接:

    a、在master中创建用户a,(随意起名,可以直接使用root)

    create user a;

    然后授权a用户主从访问权限

    grant replication slave on *.* to 'a'@'slave服务器ip' identified by '123'(密码自己设置)

    最后还必须刷新权限信息:flush privileges

    b、来到从服务器(slave)进行连接

    登录MySQL:MySQL -u用户名 -p 密码

     change master to master_host='主服务器IP',master_port=3306,master_user='a',master_password='123',master_log_file='master-bin.000001',master_log_pos=0;

    命令说明:master_host为Master服务器的ip,master_port为Master服务器的端口(默认为3306),master_user为刚刚在Master服务器上设置的user名,master_password为刚刚设置的密码,master_log_file为刚刚上面说到的要用的那个参数(ps:可以在master服务器上输入命令:show master status进行查看)

    最后一步:执行完该命令之后,表示连接成功,

    然后开启主从同步:start slave

    然后输入:show slave status\G;图片.png

    最后说一下:如果遇到:图片.png

    原因有:1、网络不通
               2、密码不对
               3、pos不对

               4、主服务器没有关闭防火墙

    在这里要解决一下防火墙的原因:在主服务器,输入命令:service iptables stop

    然后在从服务器:过程:1、stop slave;

                                    2、change master to master_host='主服务器IP',master_port=3306,master_user='a',master_password='123',master_log_file='master-bin.000001',master_log_pos=0;

                                    3、start slave;

                                    4、show slave status\G;

    如果后期从服务器会宕机,出现

    Slave_SQL_Running: No
    1.程序可能在slave上进行了写操作

    2.也可能是slave机器重起后,事务回滚造成的.

    一般是事务回滚造成的:
    解决办法:
    mysql> stop slave ;
    mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
    mysql> start slave ;



    OK;

    详见:https://www.cnblogs.com/luoyifan613/p/9436950.html


  • 欢迎您
    在windows10下安装memcache及php扩展
    yunitongxing 2019-05-27 技术语录

    15

    在windows10系统下安装memcache以及php扩展memcahce的过程记录:

    1、下载memcache压缩包:连接:https://www.runoob.com/memcached/window-install-memcached.html

    memcached <1.4.5 版本安装

    1、解压下载的安装包到指定目录。

    2、在 1.4.5 版本以前 memcached 可以作为一个服务安装,使用管理员权限运行以下命令:

    c:\memcached\memcached.exe -d install

    注意:你需要使用真实的路径替代 c:\memcached\memcached.exe。

    3、然后我们可以使用以下命令来启动和关闭 memcached 服务:

    c:\memcached\memcached.exe -d start
    c:\memcached\memcached.exe -d stop

    4、如果要修改 memcached 的配置项, 可以在命令行中执行 regedit.exe 命令打开注册表并找到 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached" 来进行修改。

    如果要提供 memcached 使用的缓存配置 可以修改 ImagePath 为:

    "c:\memcached\memcached.exe" -d runservice -m 512

    -m 512 意思是设置 memcached 最大的缓存配置为512M。

    此外我们还可以通过使用 "c:\memcached\memcached.exe -h" 命令查看更多的参数配置。

    5、如果我们需要卸载 memcached ,可以使用以下命令:

    c:\memcached\memcached.exe -d uninstall

    memcached >= 1.4.5 版本安装

    1、解压下载的安装包到指定目录。

    2、在 memcached1.4.5 版本之后,memcached 不能作为服务来运行,需要使用任务计划中来开启一个普通的进程,在 window 启动时设置 memcached自动执行。

    我们使用管理员身份执行以下命令将 memcached 添加来任务计划表中:

    schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"

    注意:你需要使用真实的路径替代 c:\memcached\memcached.exe。

    注意:-m 512 意思是设置 memcached 最大的缓存配置为512M。

    注意:我们可以通过使用 "c:\memcached\memcached.exe -h" 命令查看更多的参数配置。

    3、如果需要删除 memcached 的任务计划可以执行以下命令:

    schtasks /delete /tn memcached

    进入D:\memcached目录下,运行命令

    memcached.exe -d install (之后屏幕无任何提示)
    memcached.exe -d start

    (之后屏幕无任何提示,但是在“任务管理器”中勾选“显示所有用户进程”,此时可以看到memcached.exe进程正在运行)
     默认端口11211,外部访问需要开放该端口,否则无法成功连接。

    最后可以连接Memcached:

    打开cmd,运行命令:

    telnet 127.0.0.1 11211

    即可连接Memcached。

    (问题:telnet不是内部命令:https://jingyan.baidu.com/article/5552ef4797765f518ffbc9f0.html

    php扩展:

    下载扩展连接:https://windows.php.net/downloads/pecl/releases/memcache/3.0.8/

    下载之后解压,找到php_memcache.dll文件,并把它拷到php的ext目录下

    打开php.ini,搜索.dll找到如下图中位置,并添加一条extension=php_memcache.dll,保存

    重启apache,并在phpinfo()函数页面搜索memcache,如果能搜到说明已经安装成功了。

  • 欢迎您
    CI框架页面缓存得原理及用法
    yunitongxing 2019-05-22 技术语录

    32

    学习了一段CI框架,这两天数据库总是奔溃,原因是频繁刷新页面,今天研究了页面缓存,今天做个笔记,实现原理和实现代码

    (CodeIgniter)实现原理:

    1:在CI框架中加载视图文件使用的是$this->load->view();方法,所以从load类库着手,在ci的system文件夹中可以看到Loader.php,这个类库是在Controller.php中被加载的。Loader类中有个方法:
    function view($view, $vars = array(), $return = FALSE)//加载视图
    {
    return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
    }
    调用了自身的一个私有方法_ci_load(),这个方法其中关键部分在:
    ob_start();//开启缓存
    // If the PHP installation does not support short tags we'll
    // do a little string replacement, changing the short tags
    // to standard PHP echo statements.
     
    if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
    {
    echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('< php echo file_get_contents_ci_pathbr /> }
    else
    {
    //将视图包含进来
    include($_ci_path); // include() vs include_once() allows for multiple views with the same name
    }
    if (ob_get_level() < $this-<_ci_ob_level + 1)
    {
    ob_end_flush();
    }
    else
    {
    $_ci_CI-<output-<append_output(ob_get_contents());//获取缓存,调用了output类中的append_output方法将缓存的内容放到了output类的全局变量final_output中,供后面使用。
    @ob_end_clean();
    }
    2:CI框架中设置缓存的方法是$this-<output-<cache(n)//n是分钟数
    打开system/core/Output.php在里面有个cache方法:
    function cache($time)
    {
    $this-<cache_expiration = ( ! is_numeric($time)) ? 0 : $time;
    //output类中变量cache_expiration赋上缓存时间
    return $this;
    }
    3:打开system/core/Codeigniter.php这个核心文件。可以看到如下代码:
    $OUT =& load_class('Output', 'core');//实例化output类
     
    // 调用钩子 cache_override hook
    if ($EXT->_call_hook('cache_override') === FALSE)//如果没有设置这个缓存钩子就使用默认的_display_cache方法
    {
    if ($OUT->_display_cache($CFG, $URI) == TRUE)//将config,uri类的对象传入
    {
    exit;//如果调用缓存成功就会直接显示页面中断程序,不会加载实例化下面的类,进行一些请求,这就是缓存的好处;
    }
    }
    4:找到Output.php类中的私有方法_display_cache($CFG, $URI):
    function _display_cache(&$CFG, &$URI)
    {
    //是否在配置文件中定义了缓存路径,如果没有是用系统默认的cache文件夹作为缓存目录
    $cache_path = ($CFG->item('cache_path') == '') ? APPPATH.'cache/' : $CFG->item('cache_path');
    // 构造文件路径。文件名是 URI 的 md5 值
    $uri = $CFG->item('base_url').
    $CFG->item('index_page').
    $URI->uri_string;//这是请求的页面的控制器/方法/参数那一串字符
     
    $filepath = $cache_path.md5($uri);
     
    // 判断文件是否存在
    if ( ! @file_exists($filepath))
    {
    return FALSE;//到了这里就中断了,而是按照正常的向服务器请求页面内容,下面的return false同理
    }
     
    if ( ! $fp = @fopen($filepath, FOPEN_READ))
    {
    return FALSE;
    }
     
    flock($fp, LOCK_SH);//读取文件前给文件加个共享锁
     
    $cache = '';
    if (filesize($filepath) > 0)
    {
    $cache = fread($fp, filesize($filepath));
    }
     
    flock($fp, LOCK_UN);//释放锁
    fclose($fp);
    // 匹配内嵌时间戳
    if ( ! preg_match("/(\d+TS--->)/", $cache, $match))
    {
    return FALSE;
    }
     
    // Has the file expired? If so we'll delete it.
    // 文件过期了,就删掉
    if (time() >= trim(str_replace('TS--->', '', $match['1'])))
    {
    if (is_really_writable($cache_path))
    {
    @unlink($filepath);
    log_message('debug', "Cache file has expired. File deleted");
    return FALSE }
     
    // Display the cache
    // 显示缓存,到了这里说明有缓存文件并且缓存文件没过期,然后执行_display方法
    $this->_display(str_replace($match['0'], '', $cache));
    log_message('debug', "Cache file is current. Sending it to browser.");
    return TRUE;
    }
    5:找到Output方法中的_display($output='')方法,这个 方法有两处调用了,1个是在上述的_display_cache中,将缓存文件中的内容取出赋于$output变量然后传入_display($output='')中,这时候只会执行_display中的:
    //$CI 对象不存在,我们就知道我们是在处理缓存文件,所以简单的输出和退出
    if ( ! isset($CI))
    {
    echo $output;//直接将缓存输出,返回ture中断codeigniter继续执行
    log_message('debug', "Final output sent to browser");
    log_message('debug', "Total execution time: ".$elapsed);
    return TRUE;
    }
    第二处调用是,当if ($OUT->_display_cache($CFG, $URI) == TRUE)这个判断不成立codeigniter向下执行,
    先后实例化了一些系统核心类,以及url中请求的控制器方法等.最后执行一个钩子:
    // 调用 display_override hook
    if ($EXT->_call_hook('display_override') === FALSE)
    {
    $OUT->_display();
    }
    这时候执行这个方法是无缓存的情况下. 这时候$output为空所以执行了:
    // 设置输出数据
    if ($output == '')
    {
    $output =& $this->final_output;//这就是在Loader中设置的输出缓存.
    }
    接下来如果执行了$this->output->cache()方法设置了$this->cache_expiration 参数且没有缓存文件时:
    // 启用 cache 时,$CI 没有 _output 函数时,调用 $this->_write_cache,写缓存文件
    if ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output'))
    {
    $this->_write_cache($output);
    }
    _write_cache($output)方法如下:
    function _write_cache($output)
    {
    $CI =& get_instance();
    $path = $CI->config->item('cache_path');
    $cache_path = ($path == '') ? APPPATH.'cache/' : $path;
    // $cache_path 是目录并且可写
    if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
    {
    log_message('error', "Unable to write cache file: ".$cache_path);
    return;
    }
     
    $uri = $CI->config->item('base_url').
    $CI->config->item('index_page').
    $CI->uri->uri_string();
     
    $cache_path .= md5($uri);
     
    if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE))
    {
    log_message('error', "Unable to write cache file: ".$cache_path);
    return;
    }
     
    // 加个时间戳,指示过期时间
    $expire = time() + ($this->cache_expiration * 60);
     
    if (flock($fp, LOCK_EX))//写入前先加个独占锁
    {
    fwrite($fp, $expire.'TS--->'.$output);
    flock($fp, LOCK_UN);//写完解锁
    }
    else
    {
    log_message('error', "Unable to secure a file lock for file at: ".$cache_path);
    return;
    }
    fclose($fp);
    @chmod($cache_path, FILE_WRITE_MODE);
     
    log_message('debug', "Cache file written: ".$cache_path);
    }
    写完缓存后会进行一系列处理比如设置header等 最后输出$output:
    if (method_exists($CI, '_output'))
    {
    $CI->_output($output);
    }
    else
    {
    echo $output; // Send it to the browser!
    }	

    实现方法:

    Codeigniter支持缓存技术,以达到最快的速度。尽管CI已经相当高效了,但是网页中的动态内容、主机的内存CPU和数据库读取速度等因素直接影响了网页的加载速度。依靠网页缓存,你的网页可以达到近乎静态网页的加载速度,因为他们将程序输出的结果保存到硬盘上了。
    缓存是怎么工作的?
    CI支持每个页面单独缓存,而且可以设置缓存更新时间。当一个网页第一次被加载的时候,缓存文件将被保存到application/cache文件夹。下次访问的时候,系统就会直接读取缓存文件,然后返回给用户的浏览器。如果缓存文件过期,它将被删除并重新生成。
    注意:Benchmark标签在使用了缓存的页面仍然可用。
    启动缓存
    启用缓存功能,只需要将下面的代码放入你的任何一个控制器(controller)的方法(function)内:
    $this->output->cache(n);
    其中n是你希望缓存更新的分钟数。可以使用m/60来精确到秒,例如1/60,则是精确到1秒 上面的代码可以放到任何一个function里面。他的出现顺序对缓存并没有影响,所以将它放在你认为最合乎逻辑的地方。一旦上面的代码放到了控制器的方法中,页面就会被缓存。 警告:由于CI存储缓存文件的方式,只有通过view文件的输出才能被缓存。 注意:在缓存文件产生之前,请确保application/cache文件夹可写。
    清除缓存
    如果你不再想使用缓存,仅需将上面的代码从你的controller里面删除即可。注意:这样做并不能让缓存文件立即消失,它将会自动过期并被删除。如果你想立即删除那些文件,就必须自己动手了。
    可手动设置缓存开关。如果您想保留某些查询不被缓存 这个功能就十分有用。例如:
    // 打开缓存开关
    $this->db->cache_on();
    $query = $this->db->query("SELECT * FROM mytable");
    // 使下面这条查询不被缓存
    $this->db->cache_off();
    $query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");
    // Turn caching back on
    $this->db->cache_on();
    $query = $this->db->query("SELECT * FROM another_table");
    删除缓存文件与特定网页。如果你需要清除缓存后,更新您的数据库。
    缓存系统会在缓存存放目录中建立与被访问的URL所对应的子目录,同时把缓存文件存放在那个子目录中.缓存主目录就是您在application/config/database.php 里面设置的缓存目录. 例如, 如果您正在浏览地址为 example.com/index.php/blog/comments的页面, 缓存系统会把所有生成的缓存文件放进一个以 blog comments做为名称的文件夹里. 如果您要删除关于刚才提到的这个例子与之对应的缓存文件 需要执行以下代码:
    $this->db->cache_delete('blog', 'comments');
    $this->db->cache_delete('blog', 'comments'),我在实际测试的时候不起作用,不知道为什么原因,不知道是不是小bug?但是下面的$this->db->cache_delete_all()是可以的,没有问题。
    如果您不使用任何参数,目前的URI设置将决定什么时候应该清除/更新 该缓存。
    清除所有所有的缓存文件。例子:
    $this->db->cache_delete_all();
    
    缓存小记
    1. 数据库缓存
        数据库缓存主要是针对于SELECT查询
    // 打开缓存开关
    $this->db->cache_on();
    $query1 = $this->db->query("SELECT * FROM mytable");
    // 使下面这条查询不被缓存
    $this->db->cache_off();
    $query2 = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");
    // 再次打开缓存开关
    $this->db->cache_on();
    $query3 = $this->db->query("SELECT * FROM another_table");   
    
    这样query1和query3就被缓存在文件中了,缓存的路径根据您的URL而定,如example.com/index.php/blog/comments的页面, 缓存系统会把所有生成的缓存文件放进一个以 blog comments做为名称的文件夹里. 如果您要删除关于刚才提到的这个例子与之对应的缓存文件 需要执行以下代码:
    $this->db->cache_delete('blog', 'comments');//$this->db->cache_delete('blog', 'comments')#来删除缓存     如果要清除所有数据库缓存:
    $this->db->cache_delete_all();    *其cache模式在于针对不同的uri就会生成cache文件,如果URL中参数不同,则 cache文件就会不同,从而产生了漏洞。如果访问者构建自动生成URI,不断向服务器发起请求,就会瞬间产生大量的垃圾文件,导致系统文件臃肿。
        2. 页面缓存
    $this->output->cache(n); // 请确保application/cache可写     n 是你希望缓存更新的 分钟 数。可以使用 m/60 来精确到秒,例如 1/60 ,则是精确到 1秒
      
        3. 序例化缓存到文件
    
    $this->load->driver('cache', array('adapter' => 'apc', 'backup' => 'file'));
     
    if ( ! $foo = $this->cache->get('foo'))
     {
          echo 'Saving to the cache!<br />';
          $foo = 'foobarbaz!';
     
         // Save into the cache for 5 minutes
          $this->cache->save('foo', $foo, 300);
     }
     
    echo $foo;

    原文链接:https://www.cnblogs.com/flying-tx/p/3699536.html

                     http://www.jquerycn.cn/a_17117





  • 欢迎您
    MySQL中删除重复数据只保留一条
    yunitongxing 2019-05-10 技术语录

    25

    昨天做需求遇到一个问题,就是要把数据库中,数据表里有重复得数据,需要删除重复得数据并且保留一条啊数据,查了网上好多说法,最终选择了这个方法,借鉴别人得方法,自己收藏起来,供我们一起学习,后面我会贴出原链接

    用SQL语句,删除掉重复项只保留一条

    在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 
    1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

    SELECT
        *FROM
        peopleWHERE
        peopleId IN (        SELECT
                peopleId        FROM
                people        GROUP BY
                peopleId        HAVING
                count(peopleId) > 1
        )


    2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录


    DELETEFROM
        peopleWHERE
        peopleName IN (        SELECT
                peopleName        FROM
                people        GROUP BY
                peopleName        HAVING
                count(peopleName) > 1
        )AND peopleId NOT IN (    SELECT
            min(peopleId)    FROM
            people    GROUP BY
            peopleName    HAVING
            count(peopleName) > 1)

    3、查找表中多余的重复记录(多个字段)

    SELECT
        *FROM
        vitae aWHERE
        (a.peopleId, a.seq) IN (        SELECT
                peopleId,
                seq        FROM
                vitae        GROUP BY
                peopleId,
                seq        HAVING
                count(*) > 1
        )

    4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

    DELETEFROM
        vitae aWHERE
        (a.peopleId, a.seq) IN (        SELECT
                peopleId,
                seq        FROM
                vitae        GROUP BY
                peopleId,
                seq        HAVING
                count(*) > 1
        )AND rowid NOT IN (    SELECT
            min(rowid)    FROM
            vitae    GROUP BY
            peopleId,
            seq    HAVING
            count(*) > 1)

    5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

    SELECT
        *FROM
        vitae aWHERE
        (a.peopleId, a.seq) IN (        SELECT
                peopleId,
                seq        FROM
                vitae        GROUP BY
                peopleId,
                seq        HAVING
                count(*) > 1
        )AND rowid NOT IN (    SELECT
            min(rowid)    FROM
            vitae    GROUP BY
            peopleId,
            seq    HAVING
            count(*) > 1)

    6.消除一个字段的左边的第一位:

    UPDATE tableNameSET [ Title ]= RIGHT ([ Title ],(len([ Title ]) - 1))WHERE
        Title LIKE '村%'

    7.消除一个字段的右边的第一位:

    UPDATE tableNameSET [ Title ]= LEFT ([ Title ],(len([ Title ]) - 1))WHERE
        Title LIKE '%村'

    8.假删除表中多余的重复记录(多个字段),不包含rowid最小的记录

    UPDATE vitaeSET ispass =- 1WHERE
        peopleId IN (        SELECT
                peopleId        FROM
                vitae        GROUP BY
                peopleId

    原链接:https://www.cnblogs.com/jiangxiaobo/p/6589541.html

  • 欢迎您
    微信公众号开发关注推送消息回复实现不了的解决方法
    yunitongxing 2019-04-29 技术语录

    28

    我从开发微信公众号,遇到很多问题,一开始我要用thinkphp5框架,但是用此框架,前提是php版本必须是5.4以上版本;
    后来框架从thinkphp5换到了thinkphp3.2,原因是php版本太低,为了不影响其他项目得使用,选择了tp3.2,开始得时候还很顺利,到了
    开发自动回复模块,真的是让人头疼
    问题1:还是PHP版本问题,如果你是php7以上,获取post文件就得使用file_get_contents("php://input");否在,你要是php7版本以下,
    那你得函数就变成了$GLOBALS['HTTP_RAW_POST_DATA'];
    问题2:微信定义得FromUserName和ToUserName和"<xml>
    			                    <ToUserName><![CDATA[%s]]></ToUserName>
    			                    <FromUserName><![CDATA[%s]]></FromUserName>
    			                    <CreateTime>%s</CreateTime>
    			                    <MsgType><![CDATA[%s]]></MsgType>
    			                    <Content><![CDATA[%s]]></Content>
    			                    <FuncFlag>%d</FuncFlag>
    			                    </xml>";正好相反;更值得关注得是不要在此有任何空格出现
    问题3:这个就是困扰我很长时间得地方啊,要在php.ini里设置always_populate_raw_post_data = On ,这个是针对php7一下版本得
    1.tp5和其他的不太一样 需要去判断$_GET['echostr'] 是否为空再去访问方法如下代码

    public function index(){

            //获得参数 signature nonce token timestamp echostr

            if(isset($_GET['echostr'])){

                $nonce     = $_GET['nonce'];

                $token     = 'weixin';

                $timestamp = $_GET['timestamp'];

                $signature = $_GET['signature'];

                $echostr   = $_GET['echostr'];

                //形成数组,然后按字典序排序

                $array = array($nonce, $timestamp, $token);

                sort($array);

                //拼接成字符串,sha1加密 ,然后与signature进行校验

                $str = sha1( implode( $array ) );

                if( $str  == $signature){

                    //第一次接入weixin api接口的时候

                    ob_clean();

                    header('content-type:text');

                    echo  $echostr;

                    exit;

                }

            }else{

                $this->reponseMsg();

            }

        }

    2.我用的是tp5.1 php 版本设定的是php7.0 而网上的$postArr 大多都是


    $postArr = $GLOBALS['HTTP_RAW_POST_DATA'];

    这个在php7.0中是无法使用的所以需要改为


    $postArr = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");

    这个是tp版本通用的 上例子


     public function reponseMsg(){

            //1.获取到微信推送过来post数据(xml格式)

            //$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];//php7以上不能用

     

            $postArr = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");

            //$postArr = file_get_contents("php://input");

            //2.处理消息类型,并设置回复类型和内容

            $postObj = simplexml_load_string( $postArr );

            //判断该数据包是否是订阅的事件推送

            if( strtolower( $postObj->MsgType) == 'event'){

                //如果是关注 subscribe 事件

                if( strtolower($postObj->Event == 'subscribe') ){

                    //回复用户消息(纯文本格式)

                    $toUser   = $postObj->FromUserName;

                    $fromUser = $postObj->ToUserName;

                    $time     = time();

                    $msgType  =  'text';

                    //$content  = '您好,欢迎关注微信公众账号'.$postObj->FromUserName.'-'.$postObj->ToUserName;

                    $content  = '欢迎关注微信公众账号';

                    $template = "<xml><ToUserName><![CDATA[%s]]></ToUserName>

                                <FromUserName><![CDATA[%s]]></FromUserName>

                                <CreateTime>%s</CreateTime>

                                <MsgType><![CDATA[%s]]></MsgType>

                                <Content><![CDATA[%s]]></Content></xml>";

                    $info     = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);

                    echo $info;

                }

            }

        }//

    --------------------- 

    作者:腐腐gay 

    来源:CSDN 

    原文:https://blog.csdn.net/wanganji5252/article/details/89241423 


  • 欢迎您
    对接接口问题(遇到的坑得分享)
    yunitongxing 2019-04-17 技术语录

    90

    这是一套对接Api接口得代码,其中毫秒数得求法,还有就是这个接口对方是Java写得接口,
    所以数组形式不应该是‘=>’,而是‘:’,键值对以冒号得形式出现,通过header头传参数,
    (http通信里,除了放header里,默认就是都放入body里的)

    <?php


    //字节数组转换

    function stringToByteArray($str,$charset) {

     

        $str = iconv($charset,'UTF-8',$str);

        preg_match_all('/(.)/s',$str,$bytes); 

        $bytes=array_map('ord',$bytes[1]) ;

        return $bytes;

     

    }

    //毫秒:

    function msectime() {

    list($msec, $sec) = explode(' ', microtime());

    $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);

    return $msectime;

    }

    //(毫秒得计算,让我找了好长时间,虽然方法很多,最后选择了这个方法)



    $signature = sha1($signature);

    $url='http://123456.com';

    $postData=array(

    'a'=>1,

    'b'=>3,

    'c'=>1,

    'd'=>'aaa',

    );

    $postJosnData = json_encode($postData);

    $headers = array(

    'Content-Type: application/json; charset=utf-8',

           ' Content-Length: ' . strlen($postJosnData),

           'shijianchuo:'.$a,

           'qianming:'.$b,

    );


     $ch = curl_init();

    // 添加apikey到header

    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

    curl_setopt($ch,CURLOPT_HEADER,false);

    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,120);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $postJosnData);

    curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);

    curl_setopt($ch,CURLOPT_URL,$url);

    $response = curl_exec($ch);

    if($error=curl_error($ch)){

        die($error);

    }

    curl_close($ch);

    echo $response;


    ?>





  • 欢迎您
    MySQL运行存储过程出现1292错误
    yunitongxing 2019-04-10 技术语录

    53

    在navicat上远程连接MySQL,运行存储过程时传入了一个时间参数‘0000-00-00 00:00:00’,发生如下错误 

    1292 - Incorrect datetime value: '0000-00-00 00:00:00' for column 'targetTime' at row 1


    官方文档上说明MySQL允许将’0000-00-00’保存为“伪日期”,但是MySQL有一个NO_ZERO_DATE SQL模式,这个模式默认是打开的,不允许产生伪日期,所以要关掉这个选项。执行SQL语句: 


    set global sql_mode='STRICT_TRANS_TABLES,STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER';


    使用show variables like '%sql_mode%';查看关于sql_mode的变量,如果没有NO_ZERO_IN_DATE和NO_ZERO_DATE就说明修改成功

    --------------------- 

    原文:https://blog.csdn.net/magius/article/details/66970486 



  • 欢迎您
    Composer安装的曲折道路
    yunitongxing 2019-01-21 技术语录

    376

    由于PHP框架laravel安装,运行需要composer安装搭环境,所以开始了composer的安装路途

    Composer下载地址下面有

    1、PHP版本太低

    第一次安装composer安装成功,但运行composer install时,提示我PHP版本太低,我当时是php5.5.12,然后我就下载了一个7.2.14

    image.png

    下载链接:https://windows.php.net/download/

    2、php_xdebug-2.6.0-7.2-vc15-x86_64.dll不支持

    下载完PHP之后,.将原来版本的php5.5.12文件夹中的,php.ini , phpForApache.ini , wampserver.conf 文件 复制到 php7.1.5 文件夹中。

     修改 php.ini , phpForApache.ini 两个文件, 将两个文件中所有的 php5.5.12 替换成 php7.1.5

     

    修改wampserver.conf文件, 如果你的apache版本是 2.2X 那么修改

    $phpConf['apache']['2.2']['LoadModuleName'] = 'php5_module';$phpConf['apache']['2.2']['LoadModuleFile'] = 'php5apache2_2.dll';

     

    $phpConf['apache']['2.2']['LoadModuleName'] = 'php7_module';$phpConf['apache']['2.2']['LoadModuleFile'] = 'php7apache2_2.dll';

    如果你的apache版本是 2.4 那么修改

    $phpConf['apache']['2.4']['LoadModuleName'] = 'php5_module';$phpConf['apache']['2.4']['LoadModuleFile'] = 'php5apache2_4.dll';

     

    $phpConf['apache']['2.4']['LoadModuleName'] = 'php7_module';$phpConf['apache']['2.4']['LoadModuleFile'] = 'php7apache2_4.dll';

    wamp/bin/apache/apache2.4.9/bin 目录下,找到 php.ini 文件,将其删除。

    wamp/bin/apache/apache2.4.9/conf 目录下,找到httpd.conf 文件

     查找LoadModule, 将其改为。

    LoadModule php7_module "D:/wamp/bin/php/php7.1.5/php7apache2_4.dll"

    3、接下来就是讨厌得一步,每次提示zend_extension错误

    我下载了无数次,我最后选择Xdebug2.6.0,要看清楚电脑64位还是32

    下载地址:https://xdebug.org/download.php

     

    4、'track_errors' 提示error

    开始运行composer-setup.exe,最后有报错,这次时'track_errors',这样得提示得话就可以打开php.ini,搜索'track_errors' ,把它注释掉

    5、composer报错SHA384 is not supported by your openssl extension

    这个错误我折腾了两天,我换了一个下载composer得链接,然后运行就OK了

    下载地址https://getcomposer.org/download/


  • 姓名:孙小宇
  • 职业:PHP开发
  • 邮箱:yntx420@163.com
  • 定位:河北 · 张家口
       
  •   总访问量:2.66w+
  •   今日访问量:7
  •