用jQuery Mobile + PHP实现手机文件上传的实例教程
很简单的一个小例子 jQuery Mobile + PHP 通过超全局 $_FILES 上传,然后用move_uploaded_file()方法把上传的图片移动到到本地服务器下的文件夹,
下面是html代码
代码如下 | 复制代码 |
<!DOCTYPE html> <html> <head> <meta charset = "utf-8"> <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.css"> <script src="http://code.jquery.com/jquery-1.8.3.min.js"></script> <script src="http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.js"></script> </head> <body> <div data-role="page" id="upload" > <div data-role="header" > <h1>校园祭</h1> <a href="#pageone" data-rolr = button data-icon="home" class="ui-btn-left" >首页</a> </div> <div data-role="content" > <form action="upload_file.php" method="post" enctype="multipart/form-data" data-ajax="false"> <input id="uploadimg" name="file" type="file" runat="server" method="post" enctype="multipart/form-data" data-inline="true" data-ajax="false" /> <center><button data-inline="true" >上传</button></center> </form> </div> <div data-role="footer" data-position="fixed" data-fullscreen="true"> <h1>创新实验</h1> </div> </div> </body> </html> |
php的代码
代码如下 | 复制代码 |
<?php if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "upload/".$_FILES["file"]["name"]); echo "Stored in: " ."upload/". $_FILES["file"]["name"]; } } } ?> |
代码很简单,但是使用过程中却发现一个问题,自己试了好久都上传不了。询问了小伙伴后,发现问题所在是文件权限不足,从而限制了网页上传图片到文件夹中.所以解决办法就是把文件夹的权限问题解决掉.
代码如下 | 复制代码 |
$ cd /var/www $ sudo chmod -R 777 html |
ok,现在就可以将文件上传到服务器的文件夹了.
测试1
1,操作元素较少,单个元素比较大,英文,3个元素操作1000次
代码如下 | 复制代码 |
$data = array('hello','word'); $jsonen_sarttime = getmicrotime(); } $jsonde_starttime = getmicrotime(); echo "jsondecode耗时:".($jsonde_endtime - $jsonde_starttime)." $seri1_starttime = getmicrotime(); $seri2_starttime = getmicrotime(); echo "serialize反序列化耗时:".($seri2_endtime - $seri2_starttime)." /** |
output:
json长度:90019
jsonencode耗时:1.0974299907684
jsondecode耗时:1.6237480640411
serialize长度:90052
serialize序列化耗时:0.025779962539673
serialize反序列化耗时:0.029321193695068
可以看到json在做英文处理的时候,数组元素较少,体积要小于序列化的数据.处理效率低于序列化.
将data 更改为
代码如下 | 复制代码 |
$data = array('hello','word'); |
output:
json长度:120019
jsonencode耗时:0.83260488510132
jsondecode耗时:2.2054090499878
serialize长度:60052
serialize序列化耗时:0.01835298538208
serialize反序列化耗时:0.01848292350769
可以看到 json在做文字处理的时候,体积较大,处理效率也略低于序列化.
3.将数据更改为
代码如下 | 复制代码 |
$data = array('hello','word'); |
output:
json长度:150016
jsonencode耗时:2.1428198814392
jsondecode耗时:6.5845320224762
serialize长度:198939
serialize序列化耗时:2.8011980056763
serialize反序列化耗时:4.6967668533325
可以看到json体积略小于serialize
4.将data修改为
代码如下 | 复制代码 |
$data = array('hello','word'); |
output:
json长度:80016
jsonencode耗时:1.6437809467316
jsondecode耗时:4.5136170387268
serialize长度:188939
serialize序列化耗时:2.909558057785
serialize反序列化耗时:4.4678349494934
测试2
以一个包含1000000个元素的数组做为原始数据,分别以json, serialize, igbinary进行序列化和反向操作。
代码如下 | 复制代码 |
<?php $start = microtime(true); $start = microtime(true); $start = microtime(true); $start = microtime(true); $start = microtime(true); $start = microtime(true); |
测试结果
JSON Encode: 0.084825992584229
JSON Decode: 0.34976410865784
Serialize: 0.38241410255432
Serialize: 7.7904229164124
Igbinary Serialize: 0.046916007995605
Igbinary Serialize: 0.23396801948547
从测试结果来看,速度方面优先级排列为 igbinary > json > serialize。同时我们也可以看到,php原生的serialize在对大对象进行反向操作时,速度真是掉队一大截了。
占用字节数对比
json: 5000001
serialize: 15888902
igbinary: 7868681
在没有中文字符的情况下,json胜出,igbinary次之,serialize又被甩了几条街
结论,
如果只是英文和数字,元素比较平均,则推荐json,体积和效率均优于序列化
如果只是英文和数字,个别元素较大,则推荐serialize效率优于序列化
如果中文,元素较少,推荐序列化,体积和效率均优于json
如果中文,元素比较平均,推荐json
如果是缓存业务,效率越高越好,如果是缓存数据,体积越小越好。也要看具体的场景。
pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。pcntl_fork()函数创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同。fork怎样在您的系统工作的详细信息请查阅您的系统 的fork(2)手册。
注意:PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展.
1.首先在ubuntu下编译pcntl.so,我的ubuntu下找不到pcntl的包,于是创建一个文件夹下载了整个PHP包,在里面找到了pcntl包运行如下命令,代码如下:
代码如下 | 复制代码 |
# mkdir php # cd php # apt-get source php5 # cd php5-(WHATEVER_RELEASE)/ext/pcntl # phpize # ./configure (注一) # make # make install phpize 命令是用来准备 PHP 外挂模块的编译环境的 |
成功的安装将建立 extname.so 并放置于 PHP 的外挂模块目录中(预设存放于 /usr/lib/php/modules/ 内),需要调整 php.ini,加入 extension=extname.so 这一行之后才能使用此外挂模块.
代码如下 | 复制代码 |
void pcntl_exec(string $path [,array $args [,array $envs ]])
pcntl_exec — 在当前进程空间执行指定程序,代码如下: $cmds=array( |
例,实例多图片同步下载,代码如下:
代码如下 | 复制代码 |
#!/usr/bin/php <?php // 需要抓取的网页地址 $url = 'http://www.jb51.net'; $content = file_get_contents($url); preg_match_all('/<imgs+src="(.*?)"/', $content, $matches,PREG_SET_ORDER); echo "已发现".count($matches)."张图片n"; list($sm, $ss) = explode(" ", microtime()); foreach ($matches as $k => $val) { $pid[$k] = pcntl_fork(); if(!$pid[$k]) { download($url, $val); // 子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程 exit(0); } if ($pid[$k]) { // pcntl_waitpid($pid[$k], $status, WUNTRACED); } } echo "下载完成n"; list($em, $es) = explode(" ", microtime()); echo "用时:",($es+$em) - ($ss + $sm),"n"; /** * 抓取网页图片 * */ function download($url, $val) { $pic_url = $val[1]; if (strpos($val[1], '//') !== false) { ; } elseif (preg_match('@^(.*?)/@', $val[1], $inner_matches) == 0) { $pic_url = $url.$val[1]; } elseif (preg_match('@[:.]@', $inner_matches[1], $tmp_matches) == 0) { $pic_url = $url.$val[1]; } $pic = file_get_contents($pic_url); if ($pic === false) { return; } preg_match('@/([^/]+)$@', $pic_url, $tmp_matches); // 可使用assert处理异常 $pic_file_name = $tmp_matches[1]; $f = fopen("tmp/".$pic_file_name, "wb"); # fwrite($f, $pic); fclose($f); } /* End of file pcntl_fork.php */ ?> |
多进程同步下载图片是一个非常有用的技术,希望本教程对你有所帮助。
下面来看一个关于php实现flash流媒体视频合成(F4M格式)的例子,希望例子可以帮助到各位朋友哦。朋友发过来一个视频希望录制和下载下载,找了下工具借助此工具成功下载和合成;
去缓存拿到对应的流媒体的url地址,可以下载下来也可以通过url的方式进行合成;
推荐下载指定码率的 流媒体文件再进行合成,缓存中直接拿到的可能码率不同,合成的文件无法播放等,谨记.
项目地址:https://github.com/K-S-V/Scripts
本地下载:AdobeHDS.php And Scripts-master
Usage:
php AdobeHDS.php --manifest "your_manifest_url" --delete
MyVideo-Seg1-Frag1.f4f, MyVideo-Seg1-Frag2.f4f………MyVideo-Seg1-Frag99.f4f
php AdobeHDS.php MyVideo-Seg1-Frag
You can use script with following switches:
--help displays this help
--debug show debug output
--delete delete fragments after processing
--fproxy force proxy for downloading of fragments
--play dump stream to stdout for piping to media player
--rename rename fragments sequentially before processing
--update update the script to current git version
--auth [param] authentication string for fragment requests
--duration [param] stop recording after specified number of seconds
--filesize [param] split output file in chunks of specified size (MB)
--fragments [param] base filename for fragments
--manifest [param] manifest file for downloading of fragments
--outdir [param] destination folder for output file
--outfile [param] filename to use for output file
--parallel [param] number of fragments to download simultaneously
--proxy [param] proxy for downloading of manifest
--quality [param] selected quality level (low|medium|high) or exact bitrate
--referrer [param] Referer to use for emulation of browser requests
--start [param] start from specified fragment
--useragent [param] User-Agent to use for emulation of browser requests
通过php的Socket方式实现php程序的多线程。php本身是不支持多线程的,那么如何在php中实现多线程呢?可以想一下,WEB服务器本身都是支持多线程的。每一个访问者,当访问WEB页面的时候,都将调用新的线程,通过这一点我们可以利用WEB服务器自身的线程来解决PHP不支持多线程的问题。
下面给出通过 fsockopen() 建立socket连接,然后用 用fputs() 发送消息,来实现的PHP多线程类代码:
代码如下 | 复制代码 |
$fp=fsockopen($_SERVER['HTTP_HOST'],80,&$errno,&$errstr,5); if(!$fp){ echo "$errstr ($errno)<br />n"; } fputs($fp,"GET $_SERVER[PHP_SELF]?flag=1rn"); fclose($fp); |
上面这段代码只是一个线程的操作过程。多进行几个这样的操作就是多线程了。目前所谓PHP的多线程程序都是基于这个方式的。
下面给一个完整的线程类代码。
代码如下 | 复制代码 |
<?php /** @title:PHP多线程类(Thread) @version:1.0 @author:axgle <axgle@126.com> */ class thread { var $count; function thread($count=1) { $this->count=$count; } function _submit() { for($i=1;$i<=$this->count;$i++) $this->_thread(); return true; } function _thread() { $fp=fsockopen($_SERVER['HTTP_HOST'],80,&$errno,&$errstr,5); if(!$fp){ echo "$errstr ($errno)<br />n"; } fputs($fp,"GET $_SERVER[PHP_SELF]?flag=1rn"); fclose($fp); } function exec($func) { isset($_GET['flag'])?call_user_func($func):$this->_submit(); } } //应用例子: $th=new thread(10);//10个线程 $th->exec('demo');//执行行自定义的函数 function demo() { fopen('data/'.microtime(),'w'); } ?> |
相关文章
- 支付宝支付在国内算是大家了,我们到处都可以使用支付宝了,下文整理介绍的是在安卓app应用中使用支付宝进行支付的开发例子。 之前讲了一篇博客关与支付宝集成获取...2016-09-20
- 这篇文章主要介绍了jquery实现加载更多"转圈圈"效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-10
- PHP+Ajax有许多的功能都会用到它小编今天就有使用PHP+Ajax实现的一个微信登录功能了,下面我们来看一个PHP+Ajax手机发红包的程序例子,具体如下所示。 PHP发红包基本...2016-11-25
- 最近接了一个项目,其中有需求要用到jquery分页控件,上网也找到了需要分页控件,各种写法各种用法,都是很复杂,最终决定自己动手写一个jquery分页控件,全当是练练手了。写的不好,还请见谅,本分页控件在chrome测试过,其他的兼容性...2015-10-30
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
- 华为手机怎么恢复已卸载的应用?有时候我们在使用华为手机的时候,想知道卸载的应用怎么恢复,这篇文章主要介绍了华为手机恢复应用教程,需要的朋友可以参考下...2020-06-29
- 很多用安卓智能手机的朋友是用九宫格锁屏,网上也有暴力删除手机图形锁的方法,不过我们可以用程序来破解。本文只提供技术学习,不能干坏事 安卓手机的图形锁(九宫格)...2016-09-20
- 本文实例讲述了jQuery实现非常实用漂亮的select下拉菜单选择效果。分享给大家供大家参考,具体如下:先来看如下运行效果截图:在线演示地址如下:http://demo.jb51.net/js/2015/js-select-chose-style-menu-codes/具体代码如...2015-11-08
- 华为手机怎么开启双时钟?华为手机是可以设置双时钟的,如果来回在两个有时差的地方工作,是可以设置双时钟显示,下面我们就来看看华为添加双时钟的技巧,需要的朋友可以参考下...2020-12-08
- 本文实例讲述了jquery实现的伪分页效果代码。分享给大家供大家参考,具体如下:这里介绍的jquery伪分页效果,在火狐下表现完美,IE全系列下有些问题,引入了jQuery1.7.2插件,代码里有丰富的注释,相信对学习jQuery有不小的帮助,期...2015-10-30
- 本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
- JQuery使我们在开发Ajax应用程序的时候提高了效率,减少了许多兼容性问题,我们在Ajax项目中,遇到ajax异步获取数据出错怎么办,我们可以通过捕捉error事件来获取出错的信息。在没给大家介绍正文之前先给分享Jquery中AJAX参...2015-11-24
- 拜读一个开源框架,最想学到的就是设计的思想和实现的技巧。废话不多说,jquery这么多年了分析都写烂了,老早以前就拜读过,不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery又给扫一遍我也不会照本宣科的翻译...2014-05-31
- 当页面打开时我们需要执行一些操作,这个时候如果我们选择使用jquery的话,需要重写他的3中方法,自我感觉没什么区 别,看个人喜好了,第二种感觉比较简单明了: 第一种: 复制代码 代码如下: <script type="text/javas...2014-06-07
安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法
手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21jquery中常用的SET和GET$(”#msg”).html循环介绍
复制代码 代码如下: $(”#msg”).html(); //返回id为msg的元素节点的html内容。 $(”#msg”).html(”new content“); //将“new content” 作为html串写入id为msg的元素节点内容中,页面显示粗体的new content $(”...2013-10-13- 又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
- 这篇文章主要为大家详细介绍了jQuery实现广告显示和隐藏动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-05
- jquery中jquery.offset().top / left用于获取div距离窗口的距离,jquery.position().top / left 用于获取距离父级div的距离(必须是绝对定位的div)。 (1)先介绍jquery.offset().top / left css: 复制代码 代码如下: *{ mar...2013-10-13
- 本文实例讲述了jQuery实现文件上传进度条效果的代码。分享给大家供大家参考。具体如下: 运行效果截图如下:具体代码如下:<!DOCTYPE html><html><head><meta charset="utf-8"><title>upload</title><link rel="stylesheet...2015-11-24