超链接下载
如果浏览器支持超链接的方式下载文件,会在点击超链接的时候自动下载文件。
下面我们来测试一下通过超链接下载文件:
<a href="/Uploads/test.zip">通过超链接的方式下载文件</a><br>
当我们点击的时候如下所示:
超链接下载文件
通过超链接下载图片:
我们通过超链接下载图片时,会直接在浏览器打开显示,然后我们需要再存储到指定路径保存下来:
<a href="/Uploads/QC8054R7QPGQ_1000x500.jpg">通过超链接的方式下载图片</a><br>
效果是这样的:
超链接下载图片
通过程序下载
HTML端一行代码
<a href="download.php?filename=QC8054R7QPGQ_1000x500.jpg">通过程序的方式来下载图片</a>
download.php代码
我们是通过Header请求头来发送文件下载信息,指定下载的是附件,下载后的文件名,content-length来指定文件的大小,然后通过readfile函数来读取文件内容而实现文件下载:
<?php
$filename = $_GET['filename'];
header('content-disposition:attachment;filename='. basename($filename));
header('content-length:'. filesize($filename));
readfile($filename);
效果如下:
java里多线程就是一个new thread的事情,php依赖apache靠着linux底层有一个多线程的办法。
今天说说如果你无法操控apache的服务器,如何模拟php并发
<?php
if(function_exists('date_default_timezone_set')) {
date_default_timezone_set('PRC');
}
function a()
{
$time = time();
sleep(3);
$fp = fopen('result_a'.$time.'.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
function b()
{
$time = time();
sleep(3);
$fp = fopen('result_b'.$time.'.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
a();
}
else if($_GET['act'] == 'b') b();
?>
以上代码,在本地写入一个文件。
如果你访问 localhost/a.php 在两个浏览器标签尽可能快的同时打开,发现两个文件创建时间相差为3秒
但是如果你访问localhost/a.php?act=b 另一个访问/a.php?act=a 你发现两个文件创建的时间几乎差不多。
对于apache来说同样的url意味着一个线程(我们或者说是进程),但是不同的URL意味着可以并发。
如果php内部有下载的动作
function runThread()
{
down("http://localhost/test/a.php?act=a");
}
if($_GET['act'] == 'run')
{
echo 'start:';
runThread();
echo ' End';
}
http://localhost/test/a.php?act=run
http://localhost/test/a.php?act=run&s=2
只要主访问的url不同,则认为是不同的进行,意味着并发。文件创建时间不为3秒
本地有Linux服务器的朋友也可以借助linux来进行模拟并发
<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>
上面存成test.php, 然后写一段SHELL代码
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done
不显示调试错误
之前没有开启之前,出现这样的错误提示,并不是我们希望的,这样没有给我们任何有意义的调试信息:
解决办法
在入口处统一设置如下代码即可:
ini_set("display_errors", "On");
error_reporting(E_ALL);
php.ini的话,代码如下:
找到display_errors = On 修改为 display_errors = off
下面我们来看一篇关于PHP “Notice: Undefined variable” 和 “Notice: Undefined index”报错,希望这篇文章能够帮助到各位朋友,有兴趣的朋友可以进来看看吧。
解决Notice: Undefined variable报错
虽然 PHP不需要预先声明变量,但是依然强烈推荐大家声明以避免因为忘记给变量赋值而引起的一些安全性漏洞及可能的BUG。所以PHP以非常低的报警级别(E_NOTICE)来提醒大家正在使用一个未声明的变量。
当然解决以上报错有如下几种方法,根据场景选择适合自己的:
1.(推荐)提前声明变量,例如当你想要为一个未声明的变量连接字符串的时候。或者使用isset()/!empty()来检查是否已经声明:
$value = ""; //初始化变量
//"" 当下面需要对其进行字符串操作时
//0 当下面需要对其数字操作时
//isset()
$value = isset($_POST['value']) ? $_POST['value'] : '';
//empty()
$value = !empty($_POST['value']) ? $_POST['value'] : '';
2.设置自定义的(error handler)来处理E_NOTICE错误
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
3.禁止E_NOTICE报警
error_reporting( error_reporting() & ~E_NOTICE )
强烈建议使用第一种方法
解决Notice: Undefined index报错
当你访问数组中尚未定义的索引时会出现 Undefined index问题。
1.在访问数组索引前检查是否存在,可以使用isset()或者array_key_exists()
//isset()
$value = isset($array['my_index']) ? $array['my_index'] : '';
//array_key_exists()
$value = array_key_exists('my_index', $array) ? $array['my_index'] : '';