首页 > 编程技术 > php

php如何跨域提交form表单?本文介绍2种方法

发布时间:2016-11-25 16:18

有时我们为了网站安全考虑,我们不允许直接跨域提交form表单数据,如果我们自己有这个需求呢?下面我们来介绍两种跨域的方法解决直接跨域问题。

下面我们来看看两种php跨域提交form的方法

一,通过php curl

    function curlPost($url,$params) 
    { 
     $postData = ''; 
     foreach($params as $k => $v) 
     { 
     $postData .= $k . '='.$v.'&'; 
     } 
     rtrim($postData, '&'); 
     $ch = curl_init(); 
     curl_setopt($ch,CURLOPT_URL,$url); 
     curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
     
     curl_setopt($ch,CURLOPT_HEADER, false); 
     curl_setopt($ch, CURLOPT_POST, count($postData)); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);  
     
     $output=curl_exec($ch); 
     
     curl_close($ch); 
     return $output; 
    } 
     
    echo curlPost("http://test.com",array('name'=>"tank")); 

以前很多人用curl来抓,邮箱的通讯录,不过现在已经不可以了。哈哈。

二,利用jquery form,ajax提交

1,下载jquery.form.js

2,js代码

    $('#testform').submit(function() { 
     $(this).ajaxSubmit({ 
     type: 'post', // 提交方式 get/post 
     dataType:"json",//数据类型 
     url: 'your url', // 需要提交的 url 
     success: function(data) { // data 保存提交后返回的数据,一般为 json 数据 
     // 此处可对 data 作相关处理 
     alert('提交成功!'); 
     } 
     $(this).resetForm(); // 提交后重置表单 
     }); 
     return false; // 阻止表单自动提交事件 
    }); 

3,php代码

    header("Access-Control-Allow-Origin:*"); //跨域权限设置,允许所有 
     
    header("Access-Control-Allow-Origin:http://www.test.com"); //只允许test.com跨域提交数据 

本文我们来看看PHP自带的session隐患,session文件独占锁引起阻塞的问题,session文件阻塞会影响性能,下面来看看我们的解决方案。

在PHP中,P默认的会话处理器是session.save_handler = files(即文件)。如果同一个客户端同时并发发送多个请求(如ajax在页面同时发送多个请求),且脚本执行时间较长,就会导致session文件阻塞,影响性能。因为对于每个请求,PHP执行session_start(),就会取得文件独占锁,只有在该请求处理结束后,才会释放独占锁。这样,同时多个请求就会引起阻塞。解决方案如下:

(1)修改会话变量后,立即使用session_write_close()来保存会话数据并释放文件锁。

session_start();
 
$_SESSION['test'] = 'test';
session_write_close();
 
//do something



(2)利用session_set_save_handler()函数是实现自定义会话处理。

function open($savePath, $sessionName)
{
    echo 'open is called';
    return true;
}
 
function close()
{
    echo 'close is called';
    return true;
}
 
function read($sessionId)
{
    echo 'read is called';
    return '';
}
 
function write($sessionId, $data)
{
    echo 'write is called';
    return true;
}
 
function destroy($sessionId)
{
    echo 'destroy is called';
    return true;
}
 
function gc($lifetime)
{
    echo 'gc is called';
    return true;
}
 
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
register_shutdown_function ( 'session_write_close' );
 
session_start();
 
$_SESSION['foo'] = "bar";



当然,在 php 5.4.0之后,你可以通过实现 SessionHandlerInterface 接口或继承 SessionHandler 类来使用。

class MySessionHandler extends SessionHandler  {
 
    public function __construct()
    {
    }
 
    public function open($save_path, $session_id)
    {
    }
 
    public function close()
    {
 
    }
 
    public function create_sid()
    {
    }
 
    public function read($id)
    {
    }
 
    public function write($id, $data)
    {
    }
 
    public function destroy($id)
    {
    }
}
 
$handler = new MySessionHandler();

 
//第2个参数将函数 session_write_close()  注册为 register_shutdown_function()  函数。
session_set_save_handler($handler, true);


你可以对上面的代码进行具体实现和封装,利用mysql或其它内存数据库来管理会话数据。还能解决使用集群时,session数据共享问题。

对于这个php自带的隐患,相信官方过一段时间会有很好的解决办法。

Open Flash Chart多报表我们在许多的网站都会看到这个功能了,今天小编就来为各位介绍Open Flash Chart多报表使用方法吧


将生成好的JSON数据传递给前端,前端通过JS来实现切换效果

例子。

<?php
//
// This is the MODEL section:
//
include '../php-ofc-library/open-flash-chart.php';
$title = new title( date("D M d Y") );
$bar = new bar();
$bar->set_values( array(9,8,7,6,5,4,3,2,1) );
$chart_1 = new open_flash_chart();
$chart_1->set_title( $title );
$chart_1->add_element( $bar );

// generate some random data
srand((double)microtime()*1000000);
$tmp = array();
for( $i=0; $i<9; $i++ )
  $tmp[] = rand(1,10);
$bar_2 = new bar();
$bar_2->set_values( $tmp );
$chart_2 = new open_flash_chart();
$chart_2->set_title( new title( "Chart 2 :-)" ) );
$chart_2->add_element( $bar_2 );

//
// This is the VIEW section:
//
?>
<html>
<head>
<script type="text/javascript" src="js/json/json2.js"></script>
<script type="text/javascript" src="js/swfobject.js"></script>
<script type="text/javascript">
swfobject.embedSWF("open-flash-chart.swf", "my_chart", "350", "200", "9.0.0");
</script>
<script type="text/javascript">
function ofc_ready()
{
    alert('ofc_ready');
}
function open_flash_chart_data()
{
    alert( 'reading data' );
    return JSON.stringify(data_1);
}
function load_1()
{
  tmp = findSWF("my_chart");
  x = tmp.load( JSON.stringify(data_1) );
}
function load_2()
{
  alert("loading data_2");
  tmp = findSWF("my_chart");
  x = tmp.load( JSON.stringify(data_2) );
}
function findSWF(movieName) {
  if (navigator.appName.indexOf("Microsoft")!= -1) {
    return window[movieName];
  } else {
    return document[movieName];
  }
}
    
var data_1 = <?php echo $chart_1->toPrettyString(); ?>;
var data_2 = <?php echo $chart_2->toPrettyString(); ?>;
</script>

</head>
<body>
<p>Open Flash Chart</p>

<div id="my_chart"></div>
<br>
<a href="javascript:load_1()">display data_1</a> || <a href="javascript:load_2()">display data_2</a>
<p>
Don't forget to 'view source' to see how the Javascript JSON data is loaded.
</p>
</body>
</html>

php memcache和php memcached是php的memcache分布式的高速缓存系统的两个客户端,php memcache是老客户端,php memcached是功能更加完善的新的代替php memcached的。

php memcache独立用php实现,是老客户端,从我们实践中已发现有多个问题,而且功能少,属性也可设置的少;
php memcached是基于原生的c的libmemcached的扩展,更加完善,建议替换为php memcached。

1. Php memcache的问题

1.1 分布式问题
php memcache默认会自动切换实例,所以有时取到老数据,并且value飘忽不定。
网友分享的问题:
这几天做某个产品的时候遇到一个小问题,现象比较诡异,产品用了两台分布式的memcached服务器。某一个计数器取回来的数偶尔会不对,最后定位在php memcache client的failover机制上面。
我们知道,在memcached分布式环境下,某一个key是通过hash计算,分配到某一个memcached上面的。
如果php.ini里面 memcache.allow_failover = 1的时候,在分布式环境下,某一台memcached出问题的话,会自动到其他的memcached尝试,就会出现上面的问题。所以要设置 allow_failover = 0 那么取不到时就直接返回失败而不会从其它mc上取,这样以避免网络异常或server端异常时,经常切换实例,会取到老数据。

1.2 高并发下稳定性问题
新浪微博提到的教训:
php memcache换成php memcached,在高并发下稳定下极大提高;
另外功能更多,出错码更精确。

Twitter的缓存经验
多层次Cache,减轻某些cache节点宕掉后的影响,读写都cache;
将memcached api统一换为libmemcached(方便多语言访问memcached,让分布式等各种规则都一致。)

1.3 1秒超时间隔没法修改问题
php memcache客户端有个1秒超时间隔没法修改问题:
bool Memcache::connect ( string $host [, int $port [, int $timeout ]] )
第三个参数本来可设置timeout,单位秒,但无法修改。
测试了以下三种修改timeout的方法都无效:
1.3.1. 用memcache api Memcache::setServerParams不能修改;
1.3.2. 改memcache 源代码vi php_memcache.h宏定义不能修改;
1.3.3. php.ini内这个配置:default_socket_timeout = 60对本timeout无效。

2. memcache和memcached对比

Php memcache这个老客户端在属性设置方面可设置的很少;
出错码粒度很粗,出错后难以定位;
而且功能欠缺一些:
There are primarily two clients used with PHP. One is the older, more widespread pecl/memcache and the other is the newer, less used, more feature rich pecl/memcached.
Both support the basics such as multiple servers, setting vaules, getting values, increment, decrement and getting stats.

Here are some more advanced features and information.
项目              pecl/memcache       pecl/memcached
First Release Date      2004-06-08      2009-01-29 (beta)
Actively Developed      Yes             Yes
External Dependency     None            libmemcached
Automatic Key Fixup1    Yes             No
Append/Prepend          No              Yes
Automatic Serialzation2 Yes             Yes
Binary Protocol         No              Optional
CAS                     No              Yes
Compression             Yes             Yes
Communication Timeout   Connect Only    Various Options
Consistent Hashing      Yes             Yes
Delayed Get             No              Yes
Multi-Get               Yes             Yes
Session Support         Yes             Yes
Set/Get to a specific server    No          Yes
Stores Numerics         Converted to Strings    Yes

注释:

1 pecl/memcache will convert an invalid key into a valid key for you. pecl/memcached will return false when trying to set/get a key that is not valid.
2 You do not have to serialize your objects or arrays before sending them to the set commands. Both clients will do

本文我们来分享关于Memcache查看列出所有key方法及利用memkeys实时查看memcached key使用情况,smemkeys是tumblr开源的类似top的工具,可用于实时查看memcached的key使用情况。

Memcache 查看列出所有key方法

今天在做一个Memcache的session测试,但是在测试的过程中,发现Memcache没有一个比较简单的方法可以直接象redis那样keys *列出所有的Session key,并根据key get对应的session内容,于是,我开始查找资料,翻出来的大部分是一些memcache常用命令等,但是对列出key的办法,讲解却不多,于是来到google,找到了一个国外的资料


具体的内容我套用我的测试环境中,操作如下

1. cmd上登录memcache

> telnet 127.0.0.1 11211

2. 列出所有keys

stats items // 这条是命令
STAT items:7:number 1
 STAT items:7:age 188
 END

3. 通过itemid获取key

接下来基于列出的items id,本例中为7,第2个参数为列出的长度,0为全部列出
stats cachedump 7 0 // 这条是命令
ITEM Sess_sidsvpc1473t1np08qnkvhf6j2 [183 b; 1394527347 s]
END

4. 通过get获取key值

上面的stats cachedump命令列出了我的session key,接下来就用get命令查找对应的session值
get Sess_sidsvpc1473t1np08qnkvhf6j2 //这条是命令
VALUE
Sess_sidsvpc1473t1np08qnkvhf6j2 1440 1
 83
 Sess_|a:5:{s:6:"verify";s:32:"e70981fd305170c41a5632b2a24bbcaa";s:3:"uid";s:1:"1
 ";s:8:"username";s:5:"admin";s:9:"logintime";s:19:"2014-03-11 16:24:25";s:7:"log
 inip";s:9:"127.0.0.1";}


memkeys实时查看memcached key使用情况

memkeys

memkeys是tumblr开源的类似top的工具,可用于实时查看memcached的key使用情况.

memkeys安装

安装autoconf(要求版本2.68以上):
# wget -c http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
# tar zxvf autoconf-latest.tar.gz
# cd autoconf-2.69
# ./configure
# make && make install

安装其它依赖:
# yum install libpcap-devel pcre-devel ncurses-devel

安装memkeys:
# git clone https://github.com/tumblr/memkeys.git
# cd memkeys
# ./autogen.sh
# ./configure
# make && make install

memkeys使用

# memkeys -h
Usage: memkeys -i NIC [options]
    -d, --discard=THRESH        Discard keys where req/s rate is below THRESH
    -i, --interface=NIC         Network interface to capture traffic on (required)
    -p, --port=PORT             Network port to capture memcache traffic on (default 11211)
    -r, --refresh=INTERVAL      Refresh the stats display every INTERVAL ms (default 500)
    -l, --logfile=FILE          Output logs to FILE
    -R, --report=REPORT         Output data in REPORT format (CSV or curses, default curses)
 
    -h, --help                  This help
    -v, --verbose               Increase verbosity. May be used multiple times.
    -V, --version               Show program info and exit.

例子1:

# memkeys -i eth0 -l /tmp/memkeys.log

例子2:

# memkeys -i eth0 -d 10.0 -l /tmp/memkeys.log

标签:[!--infotagslink--]

您可能感兴趣的文章: