php操作office文档

Apicloud的云推送api, php版

  1. class ApicloudPush
  2. {
  3. public static $api = 'https://p.apicloud.com/api/push/message';
  4. public static $appid = 'A6920463******';
  5. public static $appkey = 'C******8-B6BB-3027-2C93-6C********29';
  6. public static function post($post_data)
  7. {
  8. $appkey = sha1(self::$appid . "UZ" . self::$appkey . "UZ" . time()) . "." . time();
  9. $ch = curl_init ();
  10. curl_setopt ($ch, CURLOPT_HTTPHEADER, [
  11. 'X-APICloud-AppId:'. self::$appid,
  12. 'X-APICloud-AppKey:' . $appkey
  13. ]);
  14. curl_setopt($ch, CURLOPT_POST, count($post_data));
  15. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  16. curl_setopt($ch, CURLOPT_URL, self::$api);
  17. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
  18. ob_start ();
  19. curl_exec ($ch);
  20. $result = ob_get_contents ();
  21. ob_end_clean();
  22. curl_close ($ch);
  23. return $result;
  24. }
  25. }
  26. $title = isset($_GET['title']) ? $_GET['title'] : '测试标题';
  27. $content = isset($_GET['content']) ? $_GET['content'] : '测试内容';
  28. var_dump(ApicloudPush::post([
  29. 'title' => $title,
  30. 'content' => $content,
  31. 'type' => 2, //– 消息类型,1:消息 2:通知
  32. 'platform' => 0, //0:全部平台,1:ios, 2:android
  33. // 'groupName' => 'department', //推送组名,多个组用英文逗号隔开.默认:全部组。eg.group1,group2 .
  34. // 'userIds' => 'shuai' //推送用户id, 多个用户用英文逗号分隔,eg. user1,user2。
  35. ]));

PhpStorm中文汉化

php生成网站截图

组件下载: http://wkhtmltopdf.org/
Ubuntu中文支持: apt-get install openssl build-essential xorg libssl-dev libxrender-dev fonts-arphic-bsmi00lp fonts-arphic-gbsn00lp xfonts-intl-chinese

测试命令:./wkhtmltoimage baidu.com baidu.png

php中使用:

  1. // api.php
  2. <?php
  3. $url = isset($_GET['url']) ? $_GET['url'] : die('url param is require');
  4. $cache = __DIR__ .'/cache/' . md5($url) . '.png';
  5. if (!is_file($cache)) {
  6. // 这里写组件的存放位置, 主要要给文件可执行权限 chmod 777 wkhtmltoimage
  7. $shell = __DIR__ . '/shell/wkhtmltox/bin/wkhtmltoimage '. $url .' '. $cache;
  8. shell_exec($shell);
  9. }
  10. header("Content-Type: image/png");
  11. $im = imagecreatefrompng($cache);
  12. imagesavealpha($im, true);
  13. imagepng($im);
  14. imagedestroy($im);

然后访问 http://demo.zhaishuaigan.cn/php/html2img/api.php?url=baidu.com

如何严格限制session在30分钟后过期

  1. 设置客户端cookie的lifetime为30分钟;
  2. 设置session的最大存活周期也为30分钟;
  3. 为每个session值加入时间戳,然后在程序调用时进行判断;

  至于为什么,我们首先来了解下php中session的基本原理:

  PHP中的session有效期默认是1440秒(24分钟),也就是说,客户端超过24分钟没有刷新,当前session就会失效。当然如果用户关闭了浏览器,会话也就结束了,Session自然也不存在了!

  大家知道,Session储存在服务器端,根据客户端提供的SessionID来得到这个用户的文件,然后读取文件,取得变量的值,SessionID可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……

  要控制Session的生命周期,首先我们需要了解一下php.ini关于Session的相关设置(打开php.ini文件,在“[Session]”部分):

  1. session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递;
  2. session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“PHPSESSID”;
  3. session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用!
  4. session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!

  还有很多的设置,不过和本文相关的就是这些了,下面开始讲如何设置Session的存活周期。

  前面说过,服务器通过SessionID来读取Session的数据,但是一般浏览器传送的SessionID在浏览器关闭后就没有了,那么我们只需要人为的设置SessionID并且保存下来,不就可以……

  如果你拥有服务器的操作权限,那么设置这个非常非常的简单,只是需要进行如下的步骤:

  1. 把“session.use_cookies”设置为1,使用Cookie来储存SessionID,不过默认就是1,一般不用修改;
  2. 把“session.cookie_lifetime”改为你需要设置的时间(比如一个小时,就可以设置为3600,以秒为单位);
  3. 把“session.gc_maxlifetime”设置为和“session.cookie_lifetime”一样的时间;

  在PHP的文档中明确指出,设定session有效期的参数是session.gc_maxlifetime。可以在php.ini文件中,或者通过ini_set()函数来修改这一参数。问题在于,经过多次测试,修改这个参数基本不起作用,session有效期仍然保持24分钟的默认值。

  由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改)的值,来决定是否启动一个GC(Garbage Collector)。

  默认情况下,session.gc_probability = 1,session.gc_divisor =100,也就是说有1%的可能性会启动GC。GC的工作,就是扫描所有的session信息,用当前时间减去session的最后修改时间(modified date),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删除。

  到此为止,工作一切正常。那为什么会发生gc_maxlifetime无效的情况呢?

  在默认情况下,session信息会以文本文件的形式,被保存在系统的临时文件目录中。在Linux下,这一路径通常为\tmp,在 Windows下通常为C:\Windows\Temp。当服务器上有多个PHP应用时,它们会把自己的session文件都保存在同一个目录中。同样地,这些PHP应用也会按一定机率启动GC,扫描所有的session文件。

  问题在于,GC在工作时,并不会区分不同站点的session。举例言之,站点A的gc_maxlifetime设置为2小时,站点B的 gc_maxlifetime设置为默认的24分钟。当站点B的GC启动时,它会扫描公用的临时文件目录,把所有超过24分钟的session文件全部删除掉,而不管它们来自于站点A或B。这样,站点A的gc_maxlifetime设置就形同虚设了。

  找到问题所在,解决起来就很简单了。修改session.save_path参数,或者使用session_save_path()函数,把保存session的目录指向一个专用的目录,gc_maxlifetime参数工作正常了。

  还有一个问题就是,gc_maxlifetime只能保证session生存的最短时间,并不能够保存在超过这一时间之后session信息立即会得到删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动,那么大量的session在超过gc_maxlifetime以后仍然会有效。

composer使用

最近看到php的composer感觉很好用, 这里记录一下使用方法

  1. 下载composer.phar放到项目目录 https://getcomposer.org/composer.phar

Netbeans配置远程调试ubuntu apache2 php5-xdebug

此配置方法适用于在虚拟机中搭建服务器环境, 在windows中编码的方式

1. 安装php5-xdebug

  1. sudo apt-get install php5-xdebug

2. 配置php.ini, 在最后添加xdebug配置项

  1. [xdebug]
  2. zend_extension="/usr/lib/php5/20131226/xdebug.so"
  3. xdebug.idekey="netbeans-xdebug"
  4. xdebug.remote_host=192.168.100.103
  5. xdebug.remote_connect_back=1
  6. xdebug.remote_port=9000
  7. xdebug.profiler_enable=on
  8. xdebug.remote_enable=on
  9. xdebug.remote_handle=dbgp

说明

  1. zend_extension="/usr/lib/php5/20131226/xdebug.so" # 这里根据php的版本不同, 日期路径也不一样
  2. xdebug.remote_host=192.168.100.103 # 主机的地址
  3. xdebug.remote_port=9000 # 主机netbeans的监听端口(工具 > 选项 > php > 调试 > 调试端口)

一对php的加密解密方法

一对php的加密解密方法

  1. <?php
  2. function system_encrypt($data, $key) {
  3. $str = serialize($data);
  4. $key = md5($key);
  5. $k = md5(rand(0, 100));
  6. $k = substr($k, 0, 16);
  7. $result = '';
  8. for ($i = 0; $i < strlen($str); $i++) {
  9. $result .= substr($str, $i, 1) ^ substr($key, $i % strlen($key), 1);
  10. }
  11. return base64_encode($result . $k);
  12. }
  13. function system_decrypt($str, $key) {
  14. $key = md5($key);
  15. $str = base64_decode($str);
  16. $len = strlen($str);
  17. $str = substr($str, 0, $len - 16);
  18. $result = '';
  19. for ($i = 0; $i < strlen($str); $i++) {
  20. $result .= substr($str, $i, 1) ^ substr($key, $i % strlen($key), 1);
  21. }
  22. $result = @unserialize($result);
  23. return $result ? : null;
  24. }
  25. $key = 'shuai';
  26. $data = ['uid' => 1, 'time' => time()];
  27. // 系统加密
  28. $result = system_encrypt($data, $key);
  29. echo $result . "\n\n";
  30. // 系统解密
  31. $value = system_decrypt($result, $key);
  32. var_dump($value);

php调用系统shell命令自动更新线上网站代码为git版本库最新版

我们开发网站经常使用git最为代码版本库管理功能, git可以方便多人合作和代码历史记录的保存, 很方便, 于是有很多人就直接把git版本库的代码直接部署到线上, 每次更新就用git pull 去更新网站的代码, 只是每次更新代码都需要ssh到服务器上, 很麻烦, 想到php可以执行系统命令, 就想到了用网页更新线上代码, 具体往下看

准备

  1. 你的网站是php写的
  2. 你网站的代码使用的是git clone的代码, 更新代码使用的是git pull方式

自动更新php文件

1 . 在网站根目录下新建 /update.php, 并写入下面的代码, 可以把DIR修改成网站所在目录, 如果是当前目录, 可以不修改.

  1. <?php
  2. chdir(__DIR__);
  3. echo '<pre>';
  4. echo shell_exec('/usr/bin/git pull 2>&1');

2 . 然后修改网站目录中的文件所有文件的权限为 0777
3 . 把 .git/config 文件的远程提交地址中加上帐号信息 https://username:password@git.xxx.com/xxxxx
4 . 然后就可以访问 http://xxx.com/update.php 来更新网站代码了

注意: 如果你的网站根目录是源码根目录, 要禁止http访问.git目录, 因为这里保存了你的git帐号

使用php开发windows的cmd命令方法

最近心血来潮, 想做一些命令行工具, 用来备份数据库什么的, 但自己本身并不会windows的开发, 只会php, 于是就想到了用php写命令行工具, 所以, 想看懂这篇文章, 你需要会php就可以了, 了解一点cmd命令更好, 下面看设置方法.

准备工作

  1. 因为是工具, 我想到的是以后所有的命令行工具都放在统一的位置, 比如 D:/Tools/, 先按照下面的目录结构创建好目录
    1. 目录结构:
    2. - D:/Tools/ // 工具根目录
    3. - D:/Tools/shell/ // php功能脚本存放目录
    4. - D:/Tools/bin/ // 命令映射文件存放目录
  2. 配置系统的环境变量, 把 php的安装目录D:/Tools/bin/ 加入到系统环境变量里面
  3. 编写 php功能脚本 和 命令映射文件

php功能脚本实例

为了以后扩展方便, 一个工具我们就在D:/Tools/shell/创建一个目录, 多个工具就创建多个目录

最简单的当然就是输出 hello world 了

  1. 创建文件 D:/Tools/shell/hello/hello.php
  2. D:/Tools/shell/hello/hello.php 中写入 <?php echo 'hello world'; ?>
  3. 现在直接用cmd命令行运行 php D:/Tools/shell/hello/hello.php 就可以看到控制台输出 hello world

注: 如果没有输出, 应该是php的环境变量没有配置正确

命令映射

如果用php去运行我们的工具, 显然是不方便的, 我们需要的是在任何目录都可以 hello 然后输出 hello world, 这就需要用到命令映射文件了, windows有一种特殊的文件后缀是 .cmd的文件, 如果某个目录有 xxx.cmd文件, 就可以在那个目录用 xxx 去运行这个文件, 其实系统还会去寻找环境变量目录下是否存在xxx.cmd或 xxx.exe, 所以, 我们的命令映射文件其实就是一个 xxx.cmd, 然后让xxx.cmd里面去运行我们的脚本.

  1. 创建文件 D:/Tools/bin/hello.cmd
  2. D:/Tools/bin/hello.cmd 中写入 @php "D:\Tools\shell\hello\hello.php" %*
  3. 在命令行输入 hello 回车, 就会看到我们的 hello world

注: 如果没有运行成功, 说明环境变量没有配置成功, 配置正确后, 就可以使用 hello命令了, 后面就可以在hello.php写自己的处理程序了.

php中针对命令行的一些方法

  1. <?php
  2. getcwd(); // 获取当前命令行所在的目录
  3. $argv // 命令行参数集合, 第一个是脚本文件的路径, 第二个往后是参数
  4. __DIR__ // 当前脚本所在目录
  5. // 在命令行输出中文的方法
  6. function cecho($str) {
  7. if (PHP_OS == 'WINNT') {
  8. echo iconv('utf-8', 'gbk//IGNORE', $str) . "\n";
  9. } else {
  10. echo $str . "\n";
  11. }
  12. }
  13. cecho('中文提示信息');