最近在工作中遇到一个问题:a.php程序需要将接收到的数据同时写到“线上运行的正式数据库”和“进行开发调试的测试数据库”。而测试数据库可能经 常会面临对表结构、字段、配置信息做调整等问题,很不稳定,发生错误的概率很高,如果用a.php程序同时写“正式数据库”和“测试数据库”,势必影响到 线上运行的正式服务。

  于是,我想到用PHP curl扩展库将生成的$data数组post传递一份给b.php程序,然后a.php程序继续往下执行写“正式数据库”的代码。a.php程序 将$data数组传递给b.php程序就完事了,至于b.php如何处理,就不关a.php的事了,b.php程序即使写“测试数据库”失败,也不会对 a.php程序造成影响。

  

  按照这种思路,我写了a.php和b.php的代码:

  a.php程序源代码:

<?php
$data["username"]="张宴";
$data["password"]="不知道";
$data["ip"]="192.168.0.18";//register_shutdown_function("post_data", $data);//function post_data($data)
//{$curl = new Curl_Class();$post = @$curl->post("http://127.0.0.1/b.php", $data);//这里是b.php的访问地址,请自行修改
//}//curl类
class Curl_Class
{function Curl_Class(){return true;}function execute($method, $url, $fields = '', $userAgent = '', $httpHeaders = '', $username = '', $password = ''){$ch = Curl_Class::create();if (false === $ch){return false;}if (is_string($url) && strlen($url)){$ret = curl_setopt($ch, CURLOPT_URL, $url);}else{return false;}//是否显示头部信息curl_setopt($ch, CURLOPT_HEADER, false);//curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);if ($username != ''){curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);}$method = strtolower($method);if ('post' == $method){curl_setopt($ch, CURLOPT_POST, true);if (is_array($fields)){$sets = array();foreach ($fields AS $key => $val){$sets[] = $key . '=' . urlencode($val);}$fields = implode('&',$sets);}curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);}else if ('put' == $method){curl_setopt($ch, CURLOPT_PUT, true);}//curl_setopt($ch, CURLOPT_PROGRESS, true);//curl_setopt($ch, CURLOPT_VERBOSE, true);//curl_setopt($ch, CURLOPT_MUTE, false);curl_setopt($ch, CURLOPT_TIMEOUT, 3);//设置curl超时秒数,例如将信息POST出去3秒钟后自动结束运行。if (strlen($userAgent)){curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);}if (is_array($httpHeaders)){curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeaders);}$ret = curl_exec($ch);if (curl_errno($ch)){curl_close($ch);return array(curl_error($ch), curl_errno($ch));}else{curl_close($ch);if (!is_string($ret) || !strlen($ret)){return false;}return $ret;}}function post($url, $fields, $userAgent = '', $httpHeaders = '', $username = '', $password = ''){$ret = Curl_Class::execute('POST', $url, $fields, $userAgent, $httpHeaders, $username, $password);if (false === $ret){return false;}if (is_array($ret)){return false;}return $ret;}function get($url, $userAgent = '', $httpHeaders = '', $username = '', $password = ''){$ret = Curl_Class::execute('GET', $url, '', $userAgent, $httpHeaders, $username, $password);if (false === $ret){return false;}if (is_array($ret)){return false;}return $ret;}function create(){$ch = null;if (!function_exists('curl_init')){return false;}$ch = curl_init();if (!is_resource($ch)){return false;}return $ch;}}
?>

  b.php程序源代码:

<?php
ignore_user_abort();//连线中断后(例如关闭浏览器)仍然继续执行以下的脚本直到处理完毕。
set_time_limit(0);
$get_data = file_get_contents("php://input");
$explodedata = explode("&", $get_data);foreach ($explodedata as $key => $value)//还原数组
{list($realkey, $realvalue) = explode("=", $value);$data[urldecode($realkey)] = urldecode($realvalue);
}
//现在$data数组已经和a.php中的一样了,接下来,就可以根据自己的需要对$data数组进行操作了。
//......
?>

  备注:这两段代码需要php curl扩展库的支持,查看phpinfo(),如果cURL support  enabled则表示支持curl库。
  1、Windows下的PHP开启curl库支持:
  打开php.ini,将extension=php_curl.dll前的;号去掉。

  2、Linux下的PHP开启curl库支持:
  编译PHP时在./configure后加上 --with-curl

出处:http://blog.s135.com

采用curl库在PHP程序之间传递数组相关推荐

  1. 大叔也说Xamarin~Android篇~Activity之间传递数组

    大叔也说Xamarin~Android篇~Activity之间传递数组 原文:大叔也说Xamarin~Android篇~Activity之间传递数组 我们在开发应用程序时,不可能只使用一个Layout ...

  2. ​Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]

    Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable] 在Android中的不同Activity之间传递对象,我们可以考虑采用Bun ...

  3. java 传递intent_Android中使用Intent在Activity之间传递对象(使用Serializable或者Parcelable)的方法...

    Android中的不同Activity之间传递对象,我们可以考虑采用Bundle.putSerializable(Key,Object);也可以考虑采用Bundle.putParcelable(Key ...

  4. 微信小程序——页面之间传递值

    微信小程序--页面之间传递值 小程序页面传值的方式: 1.正向传值:上一页面 -->  下一页面 url传值 本地储存 全局的app对象 2.反向传值:下一页面 -->  上一页面 本地储 ...

  5. BlackBerry应用程序之间通过persistant store传递数据

    BlackBerry native程序之间,native程序和J2ME程序之间都可以通过BlackBerry Persistant Store API传递数据. 注:Persistant Store的 ...

  6. android 活动传递数据,如何在Android应用程序的“活动”之间传递数据?

    我有一种情况,在通过登录页面登录后,每个activity上都会有一个退出button . 点击sign-out ,我将传递已登录用户的session id以便退出. 谁能指导我如何使session i ...

  7. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  8. 单片机怎么用回调函数在不同文件之间传递数据

    大家好,我是无际. 今天继续来聊下回调函数. 之前写过一篇受到了广大老铁们的认可. 最近有几个新学员被回调函数搞得有点懵逼. 不理解为什么要搞这种绕来绕去.指针指来指去的函数. 先写篇文章预热一下,晚 ...

  9. 在视图控制器之间传递数据

    我是iOS和Objective-C以及整个MVC范例的新手,但我坚持以下几点: 我有一个充当数据输入表单的视图,我想给用户选择多个产品的选项. 这些产品在另一个带有UITableViewControl ...

最新文章

  1. java运行效率优化_如何优化JAVA代码及提高执行效率
  2. Pascal's Triangle 2(leetcode java)
  3. Fiori Elements - OData metadata response and annotation merge
  4. java基本类型的包装类型_有了基本数据类型,为什么还需要包装类型
  5. html点击按钮不响应_html 脚本标签
  6. 在java中5 % 3_Java基础5
  7. Tomcat启动会遇到的问题部分解决方案
  8. 函数式编程-将Monad(单子)融入Swift
  9. 【JavaEE】ch09-反射
  10. 百度地图多点路线规划_自驾游路线规划神器:高德地图路书功能
  11. (转)所谓“降维打击”到底什么意思?
  12. ubuntu 安装python mysqldb
  13. 长【久】守护——Ag+生态抑菌给予家庭健康
  14. 包装用超声波密封行业研究及十四五规划分析报告
  15. 什么叫做SQL注入式攻击,如何防范?
  16. Elman神经网络预测的Matlab实现
  17. 百度地图,开启marker点拖拽,并监听拖拽后的坐标位置
  18. 虚幻引擎图文笔记:调整网格的光照贴图分辨率(Light Map Res)改善光照烘焙质量
  19. [iOS]-Category、Extension和关联对象
  20. fsbrain的学习笔记

热门文章

  1. 信息学奥赛C++语言: 趣味整数1(自守数)
  2. 浅谈OpenGL、OpenGL ES
  3. 【PyTorch】torch.clamp()==>将input的值限制在[min, max]之间,并返回结果到一个新张量
  4. [Unity] ACT 战斗系统学习 8:使用 ScriptableObject 制作角色属性 3
  5. ubuntu18.04安装pytorch1.6
  6. layui响应式:隐藏与显示(class 类名后缀)
  7. phpcms导航高亮:“首页” 高亮显示(含代码、截图、案例)
  8. H5 水球加载动画 - canvas应用篇
  9. 门户网站新闻资讯整站打包带全自动采集
  10. 跑腿同学校园小程序源码-已测试