apache启用gzip压缩的实现方法

一、gzip介绍

Gzip是一种流行的文件压缩算法,现在的应用十分广泛,尤其是在Linux平台。当应用Gzip压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小。这取决于文件中的内容。

利用Apache中的Gzip模块,我们可以使用Gzip压缩算法来对Apache服务器发布的网页内容进行压缩后再传输到客户端浏览器。这样经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。

网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处是Gzip与搜索引擎的抓取工具有着更好的关系。例如 Google就可以通过直接读取gzip文件来比普通手工抓取更快地检索网页。在Google网站管理员工具(Google Webmaster Tools)中你可以看到,sitemap.xml.gz 是直接作为Sitemap被提交的。

而这些好处并不仅仅限于静态内容,PHP动态页面和其他动态生成的内容均可以通过使用Apache压缩模块压缩,加上其他的性能调整机制和相应的服务器端 缓存规则,这可以大大提高网站的性能。因此,对于部署在Linux服务器上的PHP程序,在服务器支持的情况下,我们建议你开启使用Gzip Web压缩。

二、Web服务器处理HTTP压缩的过程如下:

1. Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩(Accept-Encoding 信息);

2. 如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名;

3. 如果请求文件是HTML、CSS等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;

4. 如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;

5. 如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件;

6. 如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。

下面是两个演示图:

未使用Gzip:

开启使用Gzip后:

三、实施

Apache上利用Gzip压缩算法进行压缩的模块有两种:mod_gzip 和mod_deflate。 要使用Gzip Web压缩,请首先确定你的服务器开启了对这两个组件之一的支持。在Linux服务器上,现在已经有越来越多的空间商开放了对它们的支持,有的甚至是同时 支持这两个模块的。例如目前Godaddy、Bluehost及DreamHosts等空间商的服务器都已同时支持mod_gzip 和mod_deflate。

虽然使用Gzip同时也需要客户端浏览器的支持,不过不用担心,目前大部分浏览器都已经支持Gzip了,如IE、Mozilla Firefox、Opera、Chrome等。

通过查看HTTP头,我们可以快速判断使用的客户端浏览器是否支持接受gzip压缩。若发送的HTTP头中出现以下信息,则表明你的浏览器支持接受相应的gzip压缩:

Accept-Encoding: gzip 支持mod_gzip
Accept-Encoding: deflate 支持mod_deflate

Accept-Encoding: gzip,deflate 同时支持mod_gzip 和mod_deflate  在apache2.0以上(包括apache2.0)的版中gzip压缩使用的是mod_deflate模块,下面是具体配置步骤 如下:

1、修改Apache的http.conf文件,去除mod_deflate.so前面的注释

复制代码代码如下:
LoadModule deflate_module modules/mod_deflate.so

2、在根目录中新建.htaccess文件,定制压缩规则

复制代码代码如下:
#GZIP压缩模块配置
<ifmodule mod_deflate.c>
#启用对特定MIME类型内容的压缩
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|exe|t?gz|zip|bz2|sit|rar|pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary #设置不对压缩的文件
AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-httpd-php application/x-javascript #设置对压缩的文件
</ifmodule>

3、对指定的文件配置缓存的生存时间,去除mod_headers.so模块前面的注释

复制代码代码如下:
LoadModule headers_module modules/mod_headers.so

4、在根目录中新建.htaccess文件,定制压缩规则

复制代码代码如下:
#文件缓存时间配置
<FilesMatch “.(flv|gif|jpg|jpeg|png|ico|swf|js|css)$”>
Header set Cache-Control “max-age=2592000”
</FilesMatch>

里面的文件MIME类型可以根据自己情况添加,至于PDF 、图片、音乐文档之类的这些本身都已经高度压缩格式,重复压缩的作用不大,反而可能会因为增加CPU的处理时间及浏览器的渲染问题而降低性能。所以就没必要再通过Gzip压缩。通过以上设置后再查看返回的HTTP头,出现以下信息则表明返回的数据已经过压缩。即网站程序所配置的Gzip压缩已生效。

Content-Encoding: gzip注:不管使用mod_gzip 还是mod_deflate,此处返回的信息都一样。因为它们都是实现的gzip压缩方式。

除此之外,还可以通过一些在线检查工具http://tool.chinaz.com/Gzips/来检测你的网站内容是否已经过Gzip压缩。

四、mod_gzip 和mod_deflate的主要区别是什么?使用哪个更好呢?

首先一个区别是安装它们的Apache Web服务器版本的差异。Apache 1.x系列没有内建网页压缩技术,所以才去用额外的第三方mod_gzip 模块来执行压缩。而Apache 2.x官方在开发的时候,就把网页压缩考虑进去,内建了mod_deflate 这个模块,用以取代mod_gzip。虽然两者都是使用的Gzip压缩算法,它们的运作原理是类似的。

第二个区别是压缩质量。mod_deflate 压缩速度略快而mod_gzip 的压缩比略高。一般默认情况下,mod_gzip 会比mod_deflate 多出4%~6%的压缩量。

那么,为什么使用mod_deflate?第三个区别是对服务器资源的占用。 一般来说mod_gzip 对服务器CPU的占用要高一些。mod_deflate 是专门为确保服务器的性能而使用的一个压缩模块,mod_deflate 需要较少的资源来压缩文件。这意味着在高流量的服务器,使用mod_deflate 可能会比mod_gzip 加载速度更快。

不太明白?简而言之,如果你的网站,每天不到1000独立访客,想要加快网页的加载速度,就使用mod_gzip。虽然会额外耗费一些服务器资源, 但也是值得的。如果你的网站每天超过1000独立访客,并且使用的是共享的虚拟主机,所分配系统资源有限的话,使用mod_deflate 将会是更好的选择。

另外,从Apache 2.0.45开始,mod_deflate 可使用DeflateCompressionLevel 指令来设置压缩级别。该指令的值可为1(压缩速度最快,最低的压缩质量)至9(最慢的压缩速度,压缩率最高)之间的整数,其默认值为6(压缩速度和压缩质 量较为平衡的值)。这个简单的变化更是使得mod_deflate 可以轻松媲美mod_gzip 的压缩。

P.S. 对于没有启用以上两种Gzip模块的虚拟空间,还可以退而求其次使用php的zlib函数库(同样需要查看服务器是否支持)来压缩文件,只是这种方法使用起来比较麻烦,而且一般会比较耗费服务器资源,请根据情况慎重使用。详细  php启用zlib压缩文件

CentOS系统Apache访问速度慢

原文链接:
http://www.cnblogs.com/kevingrace/p/6211887.html
http://www.2cto.com/os/201303/194028.html

网站初期,他没有做相应的优化,在后续网站并发突增,访问十分缓慢。
登陆服务器,具体现象为:
1)uptime查看负载较高;
2)ss -a(或netstat命令)查看连接数较多,并且WAIT_TIME比较多;
3)apache日志显示prefork工作模式下的并发连接数设置有问题;[mpm_prefork:error] [pid 13848] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting
4)重启apache服务后,网站暂时访问稍快,但过一会后又十分缓慢。

针对上面的现象,做了一些优化操作后,网站高并发下访问正常,速度很快。操作记录如下:
1)修改apache的最大并发连接数(默认是256)
有日志报错可知,apache采用的是默认的prefork模式(使用apache2 -l或httpd -l命令也能查看处理 )
找到mpm_prefork.conf文件进行连接数的修改(若是work模式,就修改mpm_worker.conf)
[[email protected] ~]# vim /etc/apache2/mods-available/mpm_prefork.conf
<IfModule mpm_prefork_module>
StartServers                     10
MinSpareServers               10
MaxSpareServers              20
ServerLimit                      2000
MaxRequestWorkers         1500
MaxConnectionsPerChild    10000
</IfModule>

说明:
手动添加ServerLimit,这个才是修改apache最大并发连接数的参数设置,一定要将它放在MaxRequestWorkers的前面,并且它的值也一定要大于MaxRequestWorkers的值。如上设置,apache的最大并发连接数设置为2000个。
其他的配置:
StartServers         定服务器启动时建立的子进程数量,prefork默认为5
MinSpareServers   指定空闲子进程的最小数量,默认为5。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。
MaxSpareServers  设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成”MinSpareServers+1″。
MaxRequestWorkers   最大数量的服务器进程允许开始;这个参数是这些中最为重要的一个,设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。
MaxConnectionsPerChild   每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为”0″,子进程将永远不会结束。
将MaxRequestsPerChild设置成非零值有两个好处:
1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

重启apache服务(最好是先stop,然后再start)
在/etc/apache2/apache2.conf文件中添加ServerName localhost,去掉apache服务启动中的告警信息。
[[email protected] ~]# /etc/init.d/apache2 stop
[[email protected] ~]# /etc/init.d/apache2 start

2)修改内核参数,解决WAIT_TIME过多的问题
添加下面四行内容
[[email protected] ~]# vim /etc/sysctl.conf
……
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

[[email protected] ~]# sysctl -p

调大系统最大打开的文件数
[[email protected] ~]# ulimit -n 65535

Centos 添加SWAP(交换分区)

1.进入目录

cd /var/

2.获取要增加的SWAP文件块(这里以1GB为例)

dd if=/dev/zero of=swapfile bs=1024 count=1038336

3.创建SWAP文件

/sbin/mkswap swapfile

4.激活SWAP文件

/sbin/swapon swapfile

5.查看SWAP信息是否正确

/sbin/swapon –s

6.添加到fstab文件中让系统引导时自动启动

echo “/var/swapfile swap swap defaults 0 0” >>/etc/fstab

上面这步也可以修改/etc/fstab,末尾加入/var/swapfile swap swap defaults 0 0

add-swap

React Native Network Request Failed解决方案

原文地址:http://blog.csdn.net/joyfixing/article/details/52535922

今天在用React Native写一个网络请求的demo时模拟器一直提示Network Request Failed,很是苦恼,百度搜索好久都没有找到我想要的答案,stackoverflow上有人说这个错误只在开发模式下出现,生产版本不会出现,但这根本没有解决问题。还有人说:如果使用fetch获取数据,用的是POST方法,注意headers要添加请求头。当请求为GET时不能用body,当为POST时必须包含body,设置头部之后就一切正常了。但我的fetch用的是GET方法不需要添加任何头,所以Network Request Failed的问题还没有解决。

为了防止代码出错,我直接复制了官方示例代码,如下

fetch('http://facebook.github.io/react-native/movies.json')
      .then((response) => response.json())
      .then((responseJson) => {
        console.log(responseJson.movies);
        return responseJson.movies;
      })
      .catch((error) => {
        console.error(error);
      });

居然还不行,我直接把这段代码放到浏览器console控制台运行,发现一切正常,控制台成功输出内容。那就有可能是iOS模拟器的问题了。

既然fecth api有问题那就换用XMLHttpRequest试试看,然后控制台输出了the resource could not be loaded because the app transport security policy requires the use of a secure connection,百度搜索下才发现是iOS9引入了新特性App Transport Security (ATS)。新特性要求App内访问的网络必须使用HTTPS协议,意思是Api接口以后必须是HTTPS。但是我的项目使用的是HTTP协议,现在也不能马上改成HTTPS协议传输。

还好有替代解决方案
1. 在Info.plist中添加NSAppTransportSecurity类型Dictionary。
2. 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES

具体操作可以参考这篇文档iOS9 HTTP 不能正常使用的解决办法

Centos7上搭建SVN服务器并实现自动同步至web目录

前言

由于最近跟学长一起合作完成一个小项目,然后我俩比较熟悉的版本控制是SVN,就考虑着在服务器上搭建一个SVN服务器。现在在这里给出简单的搭建过程。
(其实吧,能用Git就尽量用git吧,好处自己百度,有关搭建请参考我的另一篇博客搭建服务器上的GIT并实现自动同步到站点目录(www),这篇博客与git搭建的过程应该是基本一样的)

预期目的:

1、仓库放在 /var/svn/ 目录下,并且仓库名为 project

2、创建用户组lsgogroup,该组下添加两个成员lsgoweb1、lsgoweb2,密码直接用用户名,两用户可以checkout代码和提交代码

3、利用SVN的钩子实现当仓库的代码更新的时候自动同步至我们的web目录,在这里,我的web目录在 /home/www/ 下

一、搭建svn环境并创建仓库:

1、安装Subversion:

yum install -y subversion

2、检测是否安装成功(查看svn版本号)

svnserve --version

3、创建版本库

//先建目录
mkdir /var/svn
cd /var/svn
//创建版本库
svnadmin create /var/svn/project
cd project
//会看到自动生成的版本库文件
conf  db  format  hooks  locks  README.txt

至此,svn环境搭建成功。

二、创建用户组及用户:

1、 进入版本库中的配置目录conf,此目录有三个文件: svn服务综合配置文件(svnserve.conf)、 用户名口令文件(passwd)、权限配置文件(authz)。

2、修改权限配置文件:vim authz

3、配置用户名命令文件:vim passwd

4、配置SVN服务综合配置文件svnserve.conf

//找到以下配置项,将前面的#号去掉,然后做相应的配置
anon-access = none  //匿名用户访问权限:无
auth-access = write     //普通用户访问权限:读、写
password-db = passwd        //密码文件
authz-db = authz        //权限配置文件
realm = /var/svn/project    //版本库所在1

注意:所有以上的配置项都需要顶格,即前面不能预留空格,否则报错

5、启动svn服务:

svnserve -d -r /var/svn

如果提示:

svnserve: E000098: Can't bind server socket: Address already in use

证明现在svn已经被启动了,由于我们修改了配置文件,因此要重启svn服务

//查看svn服务详情
ps aux | grep svn
//将svn服务强制停止  其中790为svn服务的ID号,-9是kill的参数
kill -9 790

或者用

killall svnserve

再运行 svnserve -d -r /var/svn,进行启动服务

6、测试服务器:

//我们在web目录测试(/home/www)
cd /home/www
svn co svn://localhost/project

如果提示:Checked out revision 1.  表示checkout成功

我们添加新文件来测试是否提交成功

cd /home/www
touch index.php
svn add index.php   //成功的话会显示  A index.php
svn commit index.php -m "测试提交文件"

假如最后提示:

Adding         index.php
Transmitting file data .
Committed revision 2.

则表示我们svn服务器搭建成功!文件已经能够推送了。

7、本地拉取、推送

在本地首先要安装SVN吧,具体百度。。。

填写信息:

点击ok,提示输入用户名和密码

就填刚才我们创建的lsgoweb1或lsgoweb2,和对应的密码即可。

三、实现svn更新自动同步到web目录:

1、在web目录中checkout版本库

这一步算是比较关键的一步了,当时我搭建的时候试了无数次,就是缺少了这一步。把刚才checkout的版本库删掉,我们来一次比较正式的checkout:

svn co svn://localhost/project /home/www --username lsgoweb1(SVN账号) --lsgoweb1(SVN密码)

进入/var/svn/project/hooks下,建立post-commit文件:

cd /var/svn/project/hooks
vim post-commit

//在该文件里添加如下代码,保存
#!/bin/sh
#设定环境变量,如果没有设定可能会出现update报错
#设定语言,根据系统语言设置,如果是GBK就设置为 LANG=zh_CN.GBK
export LANG=en_US.utf8
SVN_PATH=/usr/bin/svn   //这里不用改
WEB_PATH=/home/www  //web目录,如果你的不同,可以改
//这里的用户随便一个就好
$SVN_PATH update $WEB_PATH --username 'lsgoweb1' --password 'lsgoweb1' --no-auth-cache

保存退出。

修改post-commit用户为www目录用户

chown apache:apache post-commit     //我的 /home/www 的用户组和所有者都是apache

给post-commit 执行权限:

chmod 755 post-commit

麻蛋,终于写完了。。。。

本博客主要参考了:  1、centos7.0搭建SVN服务器  2、CentOS创建SVN 服务器,并且设置自动同步到WEB目录  感谢原作者。

让PHP以ROOT权限执行系统命令的方法

原文地址:http://www.jb51.net/article/26232.htm

用来作为解决php以root权限执行一些普通用户不能执行的命令或应用的参考。
其实php里的popen()函数是可以解决这个问题的,但是由于某些版本的linux(如我使用的Centos 5)对系统安全的考虑,
使得这个问题解决起来麻烦了好多。先来看一个网友使用popen()函数的例子。

复制代码代码如下:
/* PHP中如何增加一个系统用户
下面是一段例程,增加一个名字为james的用户,
root密码是 louis。仅供参考
*/
$sucommand = “su root –command”;
$useradd = “/scripts/demo/runscripts.php”;
$rootpasswd = “louis”;
$user = “james”;
$user_add = sprintf(“%s %s”,$sucommand,$useradd);
$fp = @popen($user_add,”w”);
@fputs($fp,$rootpasswd);
@pclose($fp);

经过自己的测试,证实此段代码是不能实现(至少在我的系统里是这样的)作者想要获得的结果的。经过自己很长时间的google之后,
问题的关键是su root这个命令需要的密码必须以终端的方式输入,不能通过其它的方式(我也不知道还有没有其它的方式)获得。
又由于项目要求不能使用类似于sudo这种应用,无奈之下,我选择了网友提出的用编写C程序的方法来解决此问题。
首先写个C程序,命名为:run.c 放在目录/scripts/demo/下

复制代码代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
uid_t uid ,euid;
//char cmd[1024]; //变量暂时未使用
uid = getuid() ;
euid = geteuid();
printf(“my uid :%u\n”,getuid()); //这里显示的是当前的uid 可以注释掉.
printf(“my euid :%u\n”,geteuid()); //这里显示的是当前的euid
if(setreuid(euid, uid)) //交换这两个id
perror(“setreuid”);
printf(“after setreuid uid :%u\n”,getuid());
printf(“afer sertreuid euid :%u\n”,geteuid());
system(“/scripts/demo/runscripts.php”); //执行脚本
return 0;
}

编译该文件:
gcc -o run -Wall run.c
在该路径下生成run文件,这个可执行文件。如果现在用PHP脚本调用 该run的话,即使setreuid了 也是不行的。
接下来要做的是:给run赋予suid权限
# chmod u+s run
# ls
# -rwsr-xr-x 1 root root 5382 Jul 2 21:45 run
好了,已经设置上了,再写一个php页面调用它。

复制代码代码如下:
<?php
echo ‘<pre>’;
$last_line = system(‘/scripts/demo/run’, $retval);
echo ‘
</pre>
<hr />Last line of the output: ‘ . $last_line . ‘
<hr />Return value: ‘ . $retval;
?>

在浏览器中浏览。
my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48

——————————————————————————–
Last line of the output: afer sertreuid euid :48
——————————————————————————–
Return value: 0
该命令执行成功。
从显示结果可以看出: apache(daemon)的uid 为48(事实上很多linux系统下daemon的uid为2)。
调用setreuid后将有效用户id和实际用户id互换了。(必须在chmod u+s生效的情况下) 使apache当前的uid为0这样就能执行root命令了。
只需要更改 C文件中的system所要执行的命令就可以实现自己的PHP以root角色执行命令了。

在玩C 以前 玩过一段时间的PHP, 哪个时候需要用PHP 来运行root命令,一直未果,直到有一天搜索到了super这个插件.
随着玩C的日子多了.发现可以用C语言来包裹 要运行的外部命令. 实验了一下.成功了.
不需要任何外部工具就可以实现用PHP 执行root命令.
我下面就把方法发布给大家,有需求用php来运行root命令的朋友可以不用发愁了.
平台:Linux. 实验命令iptables 当前的目录是/var/www/html/http
写程序的时候 用root用户
大家都知道iptables 非root用户不能运行.
首先写个C程序
命名为:ipt.c

复制代码代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
uid_t uid ,euid;
uid = getuid() ;
euid = geteuid();
printf(“my uid :%u\n”,getuid()); //这里显示的是当前的uid 可以注释掉.
printf(“my euid :%u\n”,geteuid()); //这里显示的是当前的euid
if(setreuid(euid, uid)) //交换这两个id
perror(“setreuid”);
printf(“after setreuid uid :%u\n”,getuid());
printf(“afer sertreuid euid :%u\n”,geteuid());
system(“/sbin/iptables -L”); //执行iptables -L命令
return 0;
}

编译该文件 gcc -o ipt -Wall ipt.c
在该路径下生成ipt 这个可执行文件.
如果现在用PHP网页调用 该ipt的话,即使setreuid了 也是不行的.
接下来要做的是chmod u+s ./ipt
ls 一下
-rwsr-xr-x 1 root root 5382 Jul 2 21:45 ipt
s位已经设置上了.
再写一个php页面调用它.

复制代码代码如下:
<?php
echo ‘<pre>’;
$last_line = system(‘/var/www/html/http/ipt’, $retval);
echo ‘
</pre>
<hr />Last line of the output: ‘ . $last_line . ‘
<hr />Return value: ‘ . $retval;
?>

在浏览器中浏览.

[color=Red]Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT)
target prot opt source destination [/color]
[color=Blue]my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48[/color]

——————————————————————————–
Last line of the output: afer sertreuid euid :48
——————————————————————————–
Return value: 0

该命令执行成功..
众所周知: apache的uid 为48. 调用setreuid后 将有效用户id 和实际用户id互换了.(必须在chmod u+s生效的情况下) 使apache当前的 uid为0 这样就能执行root命令了。

大家只需要更改 C文件中的 system所要执行的命令就可以实现自己的PHP执行root命令了.

Linux下PHP开启Oracle支持(oci8)(补充pdo_oci)

原文地址:http://www.2cto.com/database/201412/364299.html

http://www.cnblogs.com/huangzhen/archive/2011/09/14/2176607.html

使用php的常见问题是:编译php时忘记添加某扩展,后来想添加扩展,但是因为安装php后又装了一些东西如PEAR等,不想删除目录重装,那么此时就需要自己重新增加某模块支持了,Linux操作系统下可以用phpize给PHP动态添加扩展.下面就以扩展模块 oci8为例(php连接oracle数据库需要改扩展支持)做简单的说明.(以下所有资源可以访问http://download.csdn.net/detail/haiqiao_2010/8294513 进行统一下载

1.下载Oracle客户端程序包,其中包含OCI、OCCI和JDBC-OCI等相关文件

1.1 根据Linux系统选择对应的软件,我的为32位系统,所以下载如下文件:

oracle-instantclient11.2-basic-11.2.0.3.0-1.i386.rpm

oracle-instantclient11.2-devel-11.2.0.3.0-1.i386.rpm

1.2下载地址: http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html (Oracle官网下载需要注册用户)

2.安装oracle客户端,运行以下命令即可:

 

rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0.i386.rpm

rpm -ivh oracle-instantclient11.2-devel-11.2.0.3.0.i386.rpm

3.安装oci8 php扩展

3.1 下载oci8-1.4.10.tgz

下载地址:http://pecl.php.net/get/oci8-1.4.10.tgz

3.2 把下载文件上传至linux服务器,并进行解压

命令:tar zxvf oci8-1.4.10.tgz#解压

3.3 转到解压目录

命令:cd oci8-1.4.10

3.4 使用phpize准备 PHP 外挂模块的编译环境,会根据指定的环境变量生成编译时需要的makefile,phpize是属于php-devel的内容,所以centos下只要运行yum install php-devel进行安装即可 (注意:/usr/local/php/bin/phpize 为我的php目录,不同则需改之;如果是64位的系统,client改成client64)

/usr/local/php/bin/phpize CFLAGS=”-I/usr/lib/oracle/11.1/client” CXXFLAGS=”-I/usr/lib/oracle/11.1/client”

3.5 编译,安装

 

要有与现有php完全相同的php压缩包。我用的是php-5.5.3.tar.gz。展开后进入里面的ext/oci8目录下,

然后执行命令: /usr/local/php/bin/phpize #这是一个可执行的文本文件,要确保它在系统中

会发现当前目录下多了一些configure文件,

如果没报错,则运行命令;

./configure –with-php-config=/usr/local/php/bin/php-config –with-oci8=/usr/lib/oracle/11.1/client

 

注意要先确保/usr/local/php/bin/php-config存在。如果你的php安装路径不是默认的,要改。

再运行以下命令 ,然后它告诉你一个目录,你把该目录下的oci8.so拷贝到你php.ini中的extension_dir指向的目录中

make
make install需要强调的是make的时候会报错,显示各种找不到库文件,需要对makefile文件进行修改加入oralce的运行库地址

打开makefile,寻找INCLUDE,形式如下:

INCLUDES = -I/usr/local/php/include/php -I/usr/include/oracle/10.2.0.3/client

然后在末尾加上=”-I/usr/lib/oracle/11.1/client,然后重新make就会成功了。

4. 修改PHP.ini(/usr/local/php/etc/php.ini)

在extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/”后增加一行:

extension = “oci8.so”

注意:要确保/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ 该目录下有oci8.so文件

5.重启apache,让oci生效

6.在web目录下创建phpinfo.php文件在其中输入一下内容,并通过web访问

 

<?php
	phpinfo();
?>

如果找到OCI8的部分就说明OCI安装正常了,如下图所示\
\

说明oci8安装成功,接下来就可以使用php访问oracle数据库

 

补充:pdo_oci的安装

1)进入文件夹

# cd php-5.3.10/ext/pdo_oci/

2) 用phpize来扩展,文件夹内执行: phpize

[[email protected] pdo_oci]# /alidata/server/php/bin/phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626

3) 编译安装

# ./configure --with-php-config=/alidata/server/php/bin/php-config --with-pdo-oci=/usr/lib/oracle/12.1/client64
# make && make install

这里同样注意,如果发生错误,则修改Makefile,在其中的INCLUDES继续添加以下内容(根据自己的路径修改):

-I/usr/include/oracle/12.1/client64 -I/usr/lib/oracle/12.1/client64

执行顺利完成后,最后一行可以看到,已经将pdo_oci.so文件放入php的modules下,只需修改下php.ini文件,添加extension=pdo_oci.so即可

PHPWord利用模板替换字符串生成精确的word文档

phpword处理docx模板时候始终发生神奇的BUG,就是复制原版例子里的${Value1}进自己的模板然后替换是没问题的,但是只要一改动这个变量文字,PHP做相应替换就失效了。

用了下残废百度无果,一怒翻起google,准确度高多了。

原来有2个PHPWord项目:

其中适用比较广的是PHPOffice项目下的一个子项目

Git地址:https://github.com/PHPOffice/PHPWord

查看官方的文档:

http://phpword.readthedocs.org/en/latest/templates-processing.html?highlight=replace

具体如何用模板做替换:

  1. include_once (‘exec/lib/phpword/src/PhpWord/PHPWord.php’);
  2. use PhpOffice\PhpWord\Autoloader;
  3. use PhpOffice\PhpWord\Settings;
  4. use PhpOffice\PhpWord\IOFactory;
  5. include_once (‘exec/lib/phpword/src/PhpWord/Autoloader.php’);
  6. Autoloader::register();
  7. Settings::loadConfig();
  8. // Create a new PHPWord Object
  9. $PHPWord = new \PhpOffice\PhpWord\PhpWord();
  10. $templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor(‘statics/template/adminPositive.docx’);
  11. $templateProcessor->setValue(‘xm1’‘姓名’);
  12. $templateProcessor->setValue(‘zw1’‘公务员’);
  13. $templateProcessor->setValue(‘sfz1’‘360281199909090009’);
  14. $templateProcessor->setValue(‘gz1’‘统发’);
  15. //$templateProcessor->setValue(‘Street’, ‘Coming-Undone-Street 32’);
  16. $templateProcessor->saveAs(‘test.docx’);

这里要注意的是换行问题。

另外copy一篇比较nice的博文做个备份

转载自:http://wangye.org/blog/archives/943/

===============================================================================================

最近一个项目开发要用到PHP技术导出Word文档,比较了几种方案,首先是使用Microsoft Office自带的ActiveX/COM组件,比如Word.Application,这种方式的优点是格式兼容度高,可以生成纯doc的Word2003格式文档,缺点一是比较占资源(调用会启动一个WINWORD.EXE进程),不适合Web多用户访问使用;二是PHP这种Web开发技术大多数是跑在Linux服务器上,当然也就无法使用Windows下的技术了,平台可移植和兼容性不好。第二种生成Word的方案是生成Word兼容的网页格式,然后以Word方式打开,这种方案总体上感觉怪怪的,毕竟文件格式是HTML的,而且格式兼容度不好,不过这种方式的优点是节省服务器资源,能够快速生成;最后一种方案也就是今天的主角,采用PHPWord生成Word2007(docx)格式的文档,现在基本上微软Office Word 2003以后的版本均兼容这种格式了,对于2003版本来说,仅需要下载安装个兼容格式包(下载地址),也能正常打开这类文件,当然如果你使用的是最新版本的Office(包括但不限于Office 2007、Office 2010)则不需要安装此格式包。

好了,下面我就介绍一下PHPWord,大家可以通过访问项目主页下载并获得关于项目的更多信息。

我在使用过程中主要遇到了中文乱码的问题,结合网上大神们的指导,通过下面的方式解决了这类问题,希望对大家有所帮助。

1、增加东亚字体支持

打开并编辑路径/Writer/Word2007/Base.php文件内容,大概在第349行(行数随着版本可能会有变化)大概函数_writeTextStyle内添加:

  1. $objWriter->writeAttribute(‘w:eastAsia’$font)

比如我的修改片段基本是下面这样:

  1. // Font
  2. if($font != ‘Arial’) {
  3.     $objWriter->startElement(‘w:rFonts’);
  4.         $objWriter->writeAttribute(‘w:eastAsia’$font); // 添加这行
  5.         $objWriter->writeAttribute(‘w:ascii’$font);
  6.         $objWriter->writeAttribute(‘w:hAnsi’$font);
  7.         $objWriter->writeAttribute(‘w:cs’$font);
  8.     $objWriter->endElement();
  9. }

2. 解决中文乱码问题

编辑PHPWord/Template.php,找到代码$replace = utf8_encode($replace);,删除或者注释掉这行代码,添加$replace = iconv( 'gbk','utf-8', $replace);,比如代码改为如下:

  1. /**
  2.  * Set a Template value
  3.  * 
  4. [email protected]$search
  5. [email protected]$replace
  6.  */
  7. public function setValue($search$replace) {
  8.     if(substr($search, 0, 2) !== ‘${‘ && substr($search, -1) !== ‘}’) {
  9.         $search = ‘${‘.$search.‘}’;
  10.     }
  11.     if(!is_array($replace)) {
  12.         //$replace = utf8_encode($replace);
  13.         $replace =iconv(‘gbk’‘utf-8’$replace); // 注释掉上面行后添加这行
  14.     }
  15.     $this->_documentXML = str_replace($search$replace$this->_documentXML);
  16. }

调用方式如下:

  1. $document->setValue(‘Template’, iconv(‘utf-8’‘GB2312//IGNORE’‘中文’));

上面的代码主要解决模板的问题,下面同样的道理,解决Section添加文本的问题,找到代码$givenText = utf8_encode($text);,删除或者注释掉这行代码,添加$givenText = iconv('gbk', 'utf-8', $text);,比如代码如下:

  1. /**
  2.  * Add a Text Element
  3.  * 
  4. [email protected]$text
  5. [email protected]$styleFont
  6. [email protected]$styleParagraph
  7. [email protected]_Section_Text
  8.  */
  9. public function addText($text$styleFont = null, $styleParagraph = null) {
  10.     //$givenText = utf8_encode($text);
  11.     $givenText = iconv(‘gbk’‘utf-8’$text); // 注释掉上面行后添加这行
  12.     $text = new PHPWord_Section_Text($givenText$styleFont$styleParagraph);
  13.     $this->_elementCollection[] = $text;
  14.     return $text;
  15. }

调用方式和上面的模板调用大同小异,这边就不列举了。

折腾了这么多,突然发现网上还有另外一个版本的PhpWord,项目类名大小写上略有不同,隶属于PHPOffice/PHPWordGitHub项目地址文档)。这个版本的PHPWord内容更加丰富,支持的功能也比较多(包括行间距,缩进和首行缩进等),最后我也采取的这个版本的PHPWord,值得注意的是这两个版本的PHPWord在API接口上基本一致,可以通用。但是有些API,在PHPOffice/PHPWord里是不推荐的,比如createSection需要改成addSection,另外应用这个版本的PHPWord不需要像上面那样做任何中文支持的修改,比较省事。

这两个PHPWord项目的官方都提供了较详细的使用例子和文档,这里就不介绍了。最后提示的是:在模板模式下loadTemplate,只能使用setValue等模板操作方法,不能再添加段落或者段落修改了。这个略有不便。

参考文档:phpword 部分BUG修改笔记及心得

对于PHPOffice/PHPWord我提供一个简单的例子供参考(当然官方例子更多):

  1. require_once ‘PhpOffice/PhpWord/PhpWord.php’// 包含头文件
  2. use PhpOffice\PhpWord\Autoloader;
  3. use PhpOffice\PhpWord\Settings;
  4. use PhpOffice\PhpWord\IOFactory;
  5. require_once __DIR__ . ‘/PhpOffice/PhpWord/Autoloader.php’;
  6. Autoloader::register();
  7. Settings::loadConfig();
  8. // Create a new PHPWord Object
  9. $PHPWord = new \PhpOffice\PhpWord\PhpWord();
  10. $PHPWordHelpernew \PhpOffice\PhpWord\Shared\Font();
  11. $PHPWord->setDefaultFontName(‘仿宋’); // 全局字体
  12. $PHPWord->setDefaultFontSize(16);     // 全局字号为3号
  13. // 设置文档的属性,这些在对文档右击属性可以看到,也可以省去这些步骤
  14. $properties = $PHPWord->getDocumentProperties();
  15. $properties->setCreator(‘张三’);   // 创建者
  16. $properties->setCompany(‘某公司’); // 公司
  17. $properties->setTitle(‘某某文档’); // 标题
  18. $properties->setDescription(‘http://wangye.org’); // 描述
  19. $properties->setLastModifiedBy(‘李四’); // 最后修改
  20. $properties->setCreated( time() );      // 创建时间
  21. $properties->setModified( time() );     // 修改时间
  22. // 添加3号仿宋字体到’FangSong16pt’留着下面使用
  23. $PHPWord->addFontStyle(‘FangSong16pt’array(‘name’=>‘仿宋’‘size’=>16));
  24. // 添加段落样式到’Normal’以备下面使用
  25. $PHPWord->addParagraphStyle(
  26.   ‘Normal’,array(
  27.     ‘align’=>‘both’,
  28.     ‘spaceBefore’ => 0,
  29.     ‘spaceAfter’ => 0,
  30.     ‘spacing’=>$PHPWordHelper->pointSizeToTwips(2.8),
  31.     ‘lineHeight’ => 1.19,  // 行间距
  32.     ‘indentation’ => array// 首行缩进
  33.       ‘firstLine’ => $PHPWordHelper->pointSizeToTwips(32)
  34.     )
  35.   )
  36. );
  37. // Section样式:上3.5厘米、下3.8厘米、左3厘米、右3厘米,页脚3厘米
  38. // 注意这里厘米(centimeter)要转换为twips单位
  39. $sectionStyle = array(
  40.     ‘orientation’ => null,
  41.     ‘marginLeft’ => $PHPWordHelper->centimeterSizeToTwips(3),
  42.     ‘marginRight’ => $PHPWordHelper->centimeterSizeToTwips(3),
  43.     ‘marginTop’ => $PHPWordHelper->centimeterSizeToTwips(3.5),
  44.     ‘marginBottom’ => $PHPWordHelper->centimeterSizeToTwips(3.8),
  45.     ‘pageNumberingStart’ => 1, // 页码从1开始
  46.     ‘footerHeight’ => $PHPWordHelper->centimeterSizeToTwips(3),
  47. );
  48. $section = $PHPWord->addSection($sectionStyle); // 添加一节
  49. // 下面这句是输入文档内容,注意这里用到了刚才我们添加的
  50. // 字体样式FangSong16pt和段落样式Normal
  51. $section->addText(‘文档内容’‘FangSong16pt’‘Normal’);
  52. $section->addTextBreak(1); // 新起一个空白段落
  53. $objWriter = IOFactory::createWriter($PHPWord‘Word2007’);
  54. $objWriter->save(‘/path/to/file’); // 保存到/path/to/file路径下

CentOS下添加PHP扩展模块mssql

原文地址:http://www.showerlee.com/archives/1269

问题描述:利用yum安装了php-mssql,但仍然phpinfo中没有mssql的信息,最后用了本文编译安装的方法,成功了。

原文内容:

如果在LINUX系统上需要使用PHP连接Microsoft SQL Server 2005数据库,我们常见的连接数据库方式是使用ODBC方式连接.

FreeTDS为Linux系统提供了TDS协议的开源客户端。由于MSSQL和Sybase使用的恰是TDS协议,所以在Linux中可以用FreeTDS连接MSSQL,下面简绍使用php的db-lib连接Microsoft SQL Server 2005数据库.

 

LINUX操作系统:   centOS6.3 64bit(安装了系统默认开发包)

APACHE:            httpd-2.4.4

PHP:                  php-5.4.13

freetds:             freetds-0.91

 

一.关闭iptables和SELINUX

# service iptables stop

# setenforce 0

# vi /etc/sysconfig/selinux

—————

SELINUX=disabled

—————

 

二.同步时间

# ntpdate cn.pool.ntp.org

 

一.安装APACHE+PHP

传送门:http://www.showerlee.com/archives/6

 

二.使用FreeTDS启用PHP连接MSSQL

1.下载FreeTds

# su –

# wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-stable.tgz

 

2.安装FreeTds

# tar -zxvf freetds-stable.tgz

# cd freetds-0.91

# ./configure –prefix=/usr/local/freetds –with-tdsver=8.0 –enable-msdblib –enable-dbmfix –with-gnu-ld –enable-shared –enable-static

# make && make install

 

3.启用PHP连接MSSQL

方法一:编译php加上freetds路径(初次部署推荐)

# wget http://cn2.php.net/distributions/php-5.4.13.tar.bz2

# tar -jxvf php-5.4.13.tar.bz2

# cd php-5.4.13

# ./configure –prefix=/usr/local/php5 –with-apxs2=/usr/local/apache2/bin/apxs –with-libxml-dir=/usr/local/lib –with-zlib-dir=/usr/local/lib –with-mysql=/usr/local/mysql –with-mysqli=/usr/local/mysql/bin/mysql_config –with-gd –enable-soap –enable-sockets  –enable-xml –enable-mbstring –with-png-dir=/usr/local –with-jpeg-dir=/usr/local –with-curl=/usr/lib –with-freetype-dir=/usr/include/freetype2/freetype/ –enable-bcmath –enable-calendar –enable-zip –enable-maintainer-zts –with-mssql=/usr/local/freetds

# make && make install

 

方法二:编译PHP的mssql扩展并加上freetds路径(二次部署推荐)

# wget http://cn2.php.net/distributions/php-5.4.13.tar.bz2

# tar -jxvf php-5.4.13.tar.bz2

# cd php-5.4.13/ext/mssql

# /usr/local/php/bin/phpize

# ./configure –with-php-config=/usr/local/php/bin/php-config –with-mssql=/usr/local/freetds

# make && make install

 

安装完毕,按照编译安装后的提示

mssql.so模块会默认保存在 /usr/local/php5/lib/php/extensions/no-debug-zts-20090626/ 目录下

 

加载该模块到php

# vi /usr/local/php5/lib/php.ini

添加如下行:

extension = “/usr/local/php5/lib/php/extensions/no-debug-zts-20090626/mssql.so”

重启apache:

# /usr/local/apache2/bin/apachectl restart

注: 如果编译php加载freetds 时候出现不能找到freetds目录,则需要以下操作(官方的Faq)

# touch /usr/local/freetds/include/tds.h

# touch /usr/local/freetds/lib/libtds.a

 

4.添加phpinfo功能,测试页面

添加以下内容info.php到/usr/local/apache2/htdocs/下,测试php模块是否加载.

# vi  /usr/local/apache2/htdocs/info.php

—————

<?php

echo phpinfo();

?>

—————

检查80端口是否打开

# lsof -i:80

浏览器输入 http://localhost/info.php

显示有如下测试页面内容, mssql.so模块即在PHP下加载成功
mssql

 

5.数据库连接测试页面:

假定mssql数据库IP为192.168.100.10,端口为1433,管理员账号密码都为”sa”

# vi /usr/local/apache2/htdocs/test_mssql_conn.php

———————————————

<?php

if(mssql_connect(‘192.168.100.10,1433′,’sa’,’sa’)){

echo   “成功 “;

}

else   {

echo   “失败 “;

}

?>

———————————————

 

浏览器输入 http://localhost/test_mssql_conn.php

测试最终连接状态.

 

大功告成….

后记: 如果有些朋友使用Yum安装的LAMP环境,然后后期需要添加mssql模块到PHP.

部署方法:

# yum install php-mssql -y

# service httpd restart

基于蓝牙的微信硬件JSAPI开发不完全指南(转)

原文地址:https://segmentfault.com/a/1190000003883095

写在前面

公司的自行车终于接入微信成功,期间经历了无数的大坑,为了同学们不在误入歧途,特地总结,希望对各位有用。你们的收藏与推荐是我继续完善的动力,如果有不明白或者有误的地方,欢迎加qq群讨论,我看到后会在第一时间回复

开发者交流QQ群:390465183

什么是微信硬件JSAPI

微信硬件是微信推出的一项基于公众号的设备服务,依托微信的平台,通过蓝牙或者wifi接入硬件设备,与微信app连接,实现各种服务

两个概念

  1. 微信js-sdk
  2. 微信硬件js-api

这里要明确两个概念,微信js-sdk是微信给开发人员使用的通用api,不分使用场景,而微信硬件jsapi是专门用来给微信硬件使用的。虽然这两个东西引入的都是同一个微信JS库,但是发挥的作用不同

前期准备

在老板跟你讲,hi,xx,我们搞了个XX手环,你把这东西给我接到微信里面去。千万不要大腿一拍开始写撸代码,你至少要准备这些东西:

  1. 一个通过微信认证的服务号
  2. 服务号开通了设备功能插件
  3. 具有操作jsapi的权限

注意:这里不要使用开发者测试号,硬件JSAPI目前还未向开发者测试账号开放,请使用正式的服务号,服务号的注册就不说了。通过认证之后,在微信后台添加设备功能插件。添加插件后,[email protected] ,申请微信硬件jsapi的操作权限

连接一个设备

我们想用微信操作一个设备,首先这个设备必须和微信连接在一起,就像下图这样,在你的微信公众号界面上,ios系统会显示已连接,安卓系统会显示已连接1个设备,只有在这个基础上,你才可以进行下一步的操作

注意,如果安卓显示已连接0个设备,那么对不起,你的连接是失败的,没有连接成功

那么如何才能在微信显示已连接呢,作为前端,你需要做好下面这些:

  1. 在微信后台申请一个设备二维码,
  2. 问硬件同学拿到你要连接的设备的mac地址,
  3. 将mac地址和设备的二维码在微信后台授权,这一步很关键
  4. 打开手机蓝牙,等待和设备的连接

注意,做为前端,你只要把上面这几步做好就可以了,剩下的就是硬件同学的事情了,当你打开微信,进入微信公众号界面,微信app就会主动寻找周围的设备,发送连接数据包,而你的设备,在收到微信数据包的时候应该主动发送回包,类似于TCP协议的三次握手,当微信收到回包之后,连接建立,微信界面就会显示已连接

引入js库

这是微信的js库,使用微信js接口,必须引入这个库,微信设备功能手册里面并没有写要引入这个库,新手在这里就要入坑了

<script type="text/javascript" src='http://res.wx.qq.com/open/js/jweixin-1.0.0.js'></script>

为页面注入配置信息

这个config中几个字符串的生成比较复杂,微信后台提供了完整的demo,可以拿来使用生成自己的配置参数

wx.config({
    beta: true, // 开启内测接口调用,注入wx.invoke方法,非常重要!!必须有这个
    debug: true,//开启调试接口,alert运行结果
    appId: '',//必填,公众号的唯一标识,
    timestamp: '',//必填,生成签名的时间戳
    nonceStr: '',//必填,生成签名的随机串
    signature: '',//必填,签名,见附录1
    jsApiList: []//要调用的js函数,必须把函数名字写入数组
});

注意:调用微信硬件jsapi必须在config中配置beta:true这个选项,而公开的开发手册里面没有讲这个,第一次接手的人走到这里绝对入坑,最后一个参数是jsApiList数组,你必须把所有用到的函数名字添加在这个数组里面,比如说初始化库的openWXDeviceLib,发送数据的sendDataToWXDevice等等

通过ready接口处理成功验证

 wx.ready(function(){
     // 初始化设备库函数
     wx.invoke('openWXDeviceLib', {}, function(res){
        // alert(res.err_msg);
     });
 }); 

注意:你必须在ready中调用openWXDeviceLib来初始化库,getWXDeviceInfos()和sendDataToWXDevice()不用在这里调用,后者在你的业务逻辑里面调用就可以

准备你要发送的数据包

var data={"deviceId"'微信给你的设备id',"base64Data"'你要发送的数据'}; 

注意:data的第一个参数是设备的id,第二个参数是你要发送的message,message一定要用base64编码,否则设备没有办法解析,在这里我在放一个使用javascript对字符串进行base64编码的函数

js封装的base64编码函数

var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
function base64encode(str) {
  var out, i, len;
  var c1, c2, c3;
  len = str.length;
  i = 0;
  out = "";
  while(i < len) {
      c1 = str.charCodeAt(i++) & 0xff;
      if(i == len)
      {
          out += base64EncodeChars.charAt(c1 >> 2);
          out += base64EncodeChars.charAt((c1 & 0x3) << 4);
          out += "==";
          break;
      }
      c2 = str.charCodeAt(i++);
      if(i == len)
      {
          out += base64EncodeChars.charAt(c1 >> 2);
          out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
          out += base64EncodeChars.charAt((c2 & 0xF) << 2);
          out += "=";
          break;
      }
      c3 = str.charCodeAt(i++);
      out += base64EncodeChars.charAt(c1 >> 2);
      out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
      out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
      out += base64EncodeChars.charAt(c3 & 0x3F);
  }
  return out;
}

发送到设备

第二个参数data就是我们在上一步准备的data,当程序执行的到这一步的时候,你的设备就应该收到了你通过蓝牙在微信里面发送的数据,使用WeixinJSBridge.invoke或者wx.invoke都可以,这两者微信都可以识别的

// 发送设置命令
wx.invoke('sendDataToWXDevice', data, function(res){
   //回调
}); 

监听设备返回的数据

在onReceiveDataFromWXDevice函数中,你可以对设备返回的任何数据进行监听,这个函数最大的用处就是初始化的时候,在页面显示设备当前信息

 wx.on('onReceiveDataFromWXDevice', function(argv) {
          var obj=eval("("+JSON.stringify(argv)+")");
          //这里的obj就是你收到的数据对象
          //这里你要对数据再做一次解码
          
  })

我遇到的问题

调用jsapi返回access_denied错误
这个一般的原因都是因为公众号还没有获得jsapi的使用权限,或者你的微信公众号后台还没有添加硬件设备功能

开发建议

用什么ui

日前微信同学开源了WeUI,这是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知更加统一。包含button、cell、dialog、 progress、 toast、article、icon等各式元素,建议设计师同学可直接采用这套ui,与微信原生视觉统一

weui框架

选一个js库

我们开发出来的应用,必须是跑在微信内置浏览器中,这个浏览器还是有很多兼容方面的问题,所以建议选用zepto.js库,避免后期出现的各种问题

本地保存绑定关系表

当设备接入微信成功之后,会有很多业务逻辑需要获取用户名下绑定的设备或者和设备有关的用户,微信有后台api给我们调用来获取这些信息,但是这些api的接口调用都是有次数限制的,所以务必在你的server上用一张表来保存所有的绑定关系

参考及开发工具

  1. 签名算法确认工具
  2. 调试接口
  3. 微信硬件官方文档

安装Composer

安装了好久才成功,关键点就在于网络。。

安装建议有以下几点:

1. 由于网络原因,执行官方推荐的各种安装命令都报错。那么就不要管那些命令了,直接下载文件composer.phar。

2. 将composer.phar拷贝至所需的项目目录,即composer.json所在的目录。

3. 命令行当前目录切换至项目目录下,执行下面的命令,添加中国镜像,否则又会由于网络原因卡死。。

php composer.par config repo.packagist composer https://packagist.phpcomposer.com

无觅相关文章插件,快速提升流量