PHP有什么好的方式实现微服务架构?
在过去的那些年PHP想要实现微服务这个概念也是比较难的,因为PHP没有这方面的优势
我们可以基于一些扩展来实现PHP微服务、比如腾讯高性能RPC开发框架Tars实现服务治理(微服务)
用TARS-PHP进行服务治理以SWOOLE+PHP7+TARS架构在阅文集团技术上带来了开发、运维、性能的全面提升。
还有一个就是Swoft,Swoft是基于swoole协程的高性能PHP微服务框架;常驻内存协程、学习曲线平滑、国内框架文档通俗易懂、加上开箱即用的RPC也可以实现PHP微服务
以上技术都是PHPer在进阶中高级、架构师的过程中必不可少的技术。
这次给大家带来PHP+Ajax如何实现表格的实时编辑,PHP+Ajax实现表格实时编辑的注意事项有哪些,下面就是实战案例,一起来看一下。
如果我们的对于一个表格中所有的数据都能在本页进行操作那该是多酷炫的一件事(用起来炒鸡爽)!
用Ajax就可以实现这个功能啦。废话不多说,下面贴出我写的demo吧哈哈。我用的TP框架(32)比较习惯啦。
首先是HTML代码部分:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AJAX实时编辑</title>
<script src="PUBLIC/jquery-172minjs"></script>
</head>
<body>
<center>
<table border="1" width="1000" id="g_table">
<tr>
<!-- <th>ID</th> -->
<th>TAB1</th>
<th>TAB2</th>
<th>TAB3</th>
<th>TAB4</th>
<th><span onclick="add()">添加</span></th>
</tr>
<foreach name="tablist" item="vv">
<tr>
<!-- <td>{$vvid}</td> -->
<input type="hidden" name="id" value="{$vvid}">
<td>{$vvtab1}</td>
<td>{$vvtab2}</td>
<td>{$vvtab3}</td>
<td>{$vvtab4}</td>
<td><span onclick="del(this)" id="del">删除</span><span onclick="edit(this)" id="edit">修改</span></td>
</tr>
</foreach>
</table>
</center>
</body>
<script>
var g_table = $("#g_table");
function add(){
var addRow = $("<tr></tr>");
g_tableappend(addRow);
for(var i = 0;i < 4;i++){
var col_td = $("<td><input type='text' /></td>");
addRowappend(col_td);
}
var col_opt = $("<td></td>");
var confirmBtn = $("<a href='javascript:;'>确认</a>");
var cancelBtn = $("<a href='javascript:;'>取消</a>");
cancelBtnclick(function(){
windowlocationreload();
});
confirmBtnclick(function(){
var currentRow = $(this)parent()parent();
var input_files = currentRowfind("input");
var post_files = {};
for(var i = 0 , j = input_fileslength;i < j;i++){
post_files['clo_' + i] = input_files[i]value;
}
// $post("{:U('ajax/add')}",post_files,function(msg){
// debugger;
// })
$ajax({
type: 'post',
url : "{:U('ajax/add')}",
data: {post_files},
success:function(msg){
alert(msg);
windowlocationreload();
}
})
});
col_optappend(confirmBtn);
col_optappend(cancelBtn);
addRowappend(col_opt);
}
function del(obj){
var id = $(obj)parent()prev()prev()prev()prev()prev()val();
$ajax({
type: 'post',
url: "{:U('ajax/del')}",
data: {id:id},
success:function(msg){
alert(msg);
}
})
$(obj)parent()parent()remove();
}
function edit(obj){
var id = $(obj)parent()prev()prev()prev()prev()prev()val();
for(var i = 1;i < 5;i++){
var temp = "<td><input type='text' value='" + $(obj)parent()parent()children()eq(i)html() + "'/></td>";
$(obj)parent()parent()children()eq(i)replaceWith(temp);
}
var confirmBtn1 = $("<span id='confirm'>确认</span>");
var cancelBtn1 = $("<span onclick='back()'>取消</span>");
confirmBtn1click(function(){
var currentRow = $(this)parent()parent();
var input_files = currentRowfind("input");
var post_files = {};
for(var i = 0 , j = input_fileslength;i < j;i++){
post_files['clo_' + i] = input_files[i]value;
}
$ajax({
type: 'post',
url : "{:U('ajax/edit')}",
data: {post_files:post_files,id:id},
success:function(msg){
alert(msg);
windowlocationreload();
}
})
});
$(obj)prev()replaceWith(confirmBtn1);
$(obj)replaceWith(cancelBtn1);
}
function back(){
locationreload();
}
</script>
</html>下面是控制器中的代码:
<php
namespace Home\Controller;
use Think\Controller;
class AjaxController extends Controller{
public function index(){
$tab = M('table');
$tablist = $tab->select();
$this->assign('tablist',$tablist);
$this->display();
}
public function del(){
$map['id'] = $_POST['id'];
$tab = M('table');
$info = $tab->where($map)->delete();
if($info){
$this->ajaxReturn("删除成功");
}else{
$this->ajaxReturn("删除失败");
}
}
public function add(){
$map['tab1'] = $_POST['post_files']['clo_0'];
$map['tab2'] = $_POST['post_files']['clo_1'];
$map['tab3'] = $_POST['post_files']['clo_2'];
$map['tab4'] = $_POST['post_files']['clo_3'];
$tab = M('table');
$res = $tab->add($map);
if($res){
$this->ajaxReturn("添加成功");
}else{
$this->ajaxReturn("添加失败");
}
}
public function edit(){
$id = $_POST['id'];
$map['tab1'] = $_POST['post_files']['clo_1'];
$map['tab2'] = $_POST['post_files']['clo_2'];
$map['tab3'] = $_POST['post_files']['clo_3'];
$map['tab4'] = $_POST['post_files']['clo_4'];
// dump($map);exit;
$tab = M('table');
$res = $tab->where('id='$id)->save($map);
if($res){
$this->ajaxReturn("更新成功");
}else{
$this->ajaxReturn("更新失败");
}
}
}相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
推荐阅读:
Ajax+Spring实现文件上传
怎么用Ajax实现动态加载数据的功能
Ajax怎么实现上传文件的进度条Codular
php实现api接口的方法:首先安装好phpStudy并启动;然后将项目代码放在WWW目录下;接着创建数据库;最后编写接口,并通过路由进行网络请求即可。
推荐:《PHP视频教程》
用PHP编写简单的api(数据接口)
一、编写接口所需几样工具或软件(均是win7+64位):
1phpStudy、SQLyog和编码工具(sublime text/webStorm/vs code均可,按自己习惯来);
2安装好phpStudy之后,打开软件,点击启动;如果Apache和MySQL右边的显示都是绿色的,那么说明服务启动成功;另外注意一下开始的PHP服务版本,因为不同的版本对应不同nodejs版本或SQLyog版本,如果开启不了,则自行百度解决,一般都是要下载对应支持的VC9(分32位和64位)或VC11(分32位和64位)。
3特别要注意的是,项目代码一定要放在WWW目录下,也就是安装phpStudy的目录下。我的是phpStudy/WWW,新版phpStudy可能会不一样,多找找几个文件夹,找到WWW文件夹即可。
3SQLyog:用于操作数据库。正版的需要破解(破解方法百度),打开之后就弹出以下窗口,有四个信息是比较重要的。
1)MySQL主机地址:填写 localhost即可
2)用户名和密码:默认都是root
3)端口:默认3306
4)点击“连接”按钮进入(千万要注意:只有在mysql服务启动之后,才能点击连接,不然会出现错误码2003的错误提示)
2右击左上角的root@localhost,然后选择创建数据库;
3然后在数据库名,填写自己的数据名称;
4创建之后,点击左边的+号打开,然后再右击table,会出现创建表的选项;
5点击创建表之后弹出以下框,随后在表格里填写你想要的字段和这个字段的数据类型和长度大小以及是否为空,默认值为多少等,填写完之后点击左下角的创建表就创建成功了;
6最起初我们肯定要获取到数据的,也就是get请求,所以表中我们要填充一些数据
二、安装后台开发环境:
1这里博主用的是比较流行的后台框架lavarel,可以直接去管理一键下载即可,然后解压安装;
2将解压后的文件夹放在phpStudy下的WWW文件夹下,开启phpStudy之后,直接在浏览器里输入:
localhost/解压后的文件夹名称/server/public/,然后回车就可看到以下界面(红色框是我的文件路径),出现以下界面说明开发环境搭建成功。
三、正式编写接口:
1首先要连接到你的本地数据库(也就是刚才在SQLyog里新建的数据库)。将解压后的项目拖到编辑工具里(这里我用的sublime text),然后打开env文件,如下图:
2然后在里面修改一些配置。下图中我框出的六个配置要跟之前设置的要匹配,比如DB_CONNECTION=mysql;DB_HOST=localhost;DB_PORT=3306;即连接的数据库类型、域名和端口号,这个一般都是默认的,也与我们之前设置的是匹配的,最重要的是下面椭圆框框出的三个:
DB_DATABASE=test;这个是链接的数据库名称,刚才我们新建的就是test数据库;
下面两个是用户名和密码:默认都是root
DB_USERNAME=root
DB_PASSWORD=root
3连接好数据库之后,在app目录下新建一个Questionphp文件,用于访问question数据表;
class Question extends Model{
protected $table = 'question';//这里是访问question这个表
protected $primaryKey = 'id';//这是访问question表必须要带的字段
protected function getDateFormat()
{
return time();
}
}4开始编写真正意义上的接口了。在app/Http/Controllers目录下新建一个QuestionControllerphp文件,然后在上面写上:
use AppQuestion 表示要接入这个数据,便于操作;
public function getQuestion(Request $request){
$response = array('status'=>'0','msg'=>'failed','data'=>'');
$data = array();
// 获取请求参数值
$questionId = $request->input("questionId");
// 根据参数值去向表里查找对应的数据
$question = Question::find($questionId);
// 查找完毕之后,把查找到的数据赋值给response下的data字段
$response['data'] = $question;
$response['status'] = '2';
$response['msg'] = 'success';
return json_encode($response);
}5写完接口之后,最后是通过路由进行网络请求的,所以还要在routes目录下的webphp文件里写下:
Route::any('getQuestion', "QuestionController@getQuestion");用于访问这个接口;
6测试。最后一个步骤就是测试自己写的接口是否可用,测试之前一定要记得把服务器打开。在浏览器地址输入栏输入:
localhost/解压后的文件夹名称/server/public/getQuestionquestionId=1就可以获取到后台返回的数据了。这时会发现,返回的数据跟我们之前在表中填充的数据是一模一样的,那就意味着你写接口是成功的。
php实现查询功能的方法:首先创建好前端文件以及PHP代码文件;然后通过所引用的封装类“DBDA”来实现查询功能即可。
推荐:《PHP视频教程》
分享php实现查询功能的具体代码
输入关键字效果
代码:
<body>
<h1>汽车信息</h1>
<php
require"DBDAclass1php";//$type 代表SQL语句的类型,0代表增删改,1代表查询
$db = new DBDA();
//如果没有提交数据,显示所有
//如果有提交数据,根据关键字查询显示
$name = "";
$tj1 = " 1=1 ";//第一个条件,对应名称,注意空格
$tj2 = " 1=1 ";//第二个条件,对应系列,注意空格
if(!empty($_POST["name"]))
{
$name = $_POST["name"];
$tj1 = " name like '%{$name}%'";
}
if(!empty($_POST["brand"]))
{
$brand = $_POST["brand"];
$tj2 = " brand like '%{$brand}%'";
}
//总条件
$tj ="{$tj1} and {$tj2}";
$sql = "select from car where "$tj;//注意where后空格
/echo $sql;/
>
<form action="chaxunphp" method="post">
<p>名称:<input type="text" name="name" value="<php echo $name >"/>系列:<input type="text" name="brand"/><input type="submit" value="查询" /></p>
</form>
<br/>
<table width="100%" border="1" cellpadding="0" cellspacing="0">
<tr>
<td>代号</td>
<td>名称</td>
<td>系列</td>
<td>上市时间</td>
<td>价格</td>
</tr>
<php
//只适用于单条件查询
/$sql = "select from car";
$name="";
if(!empty($_POST["name"]))
{
$name = $_POST["name"];
$sql = "select from car where name like '%{$name}%' ";
}/
$arr = $db->query($sql);
foreach($arr as $v)
{
$str = str_replace($name,"<span style='color:red'>{$name}</span>",$v[1]);
echo "<tr>
<td>{$v[0]}</td>
<td>{$str}</td>
<td>{$v[2]}</td>
<td>{$v[3]}</td>
<td>{$v[7]}</td>
</tr>";
}
>
</table>
</body>
</html>所引用的封装类
<php
class DBDA
{
public $host = "localhost";
public $uid = "root";
public $pwd = "123";
public $dbname = "newssystem";
//执行SQL语句返回相应的结果
//$sql 要执行的SQL语句
//$type 代表SQL语句的类型,0代表增删改,1代表查询
function query($sql,$type=1)
{
$db = new MySQLi($this->host,$this->uid,$this->pwd,$this->dbname);
$result = $db->query($sql);
if($type)
{
//如果是查询,显示数据
return $result->fetch_all();
}
else
{
//如果是增删改,返回true或者false
return $result;
}
}
}
php实现接口的方法:通过接口定义实现,代码为[修饰符] class <类名> [extends 父类名] [implements 接口列表]{[public] [static] [final] 常量;}。
php实现接口的方法:
接口的思想是指定一个实现了该接口的类必须实现的一系列函数。一般,我们用interface来声明一个接口,并在接口中声明一些方法(即函数),注意只是声明不用实现这个函数。然后,用class声明一个类并用implements去使用这个接口,再在类中把接口中的声明的方法进行实现。
一般定义方法如下:
接口定义:
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限。
接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。
extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。
方法:接口中的方法只有定义而没有被实现。
接口实现:
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{
}修饰符:可选参数,用于指定类的访问权限,可选值为public、abstract和final。
类名:必选参数,用于指定类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。
extends 父类名:可选参数,用于指定要定义的类继承于哪个父类。当使用extends关键字时,父类名为必选参数。
implements 接口列表:可选参数,用于指定该类实现的是哪些接口。当使用implements关键字时,接口列表为必选参数。当接口列表中存在多个接口名时,各个接口名之间使用逗号分隔。
例子:
接口定义:
public interface CalInterface
{
final float PI=314159f;//定义用于表示圆周率的常量PI
float getArea(float r);//定义一个用于计算面积的方法getArea()
float getCircumference(float r);//定义一个用于计算周长的方法getCircumference()
}接口实现:
public class Cire implements CalInterface
{
public float getArea(float r)
{
float area=PIrr;//计算圆面积并赋值给变量area
return area;//返回计算后的圆面积
}
public float getCircumference(float r)
{
float circumference=2PIr; //计算圆周长并赋值给变量circumference
return circumference; //返回计算后的圆周长
}
public static void main(String[] args)
{
Cire c = new Cire();
float f = cgetArea(20f);
Systemoutprintln(FloattoString(f));
}
}注意,如果没有实现接口中指定的方法,将产生一个致命错误。
想了解更多编程学习,敬请关注php培训栏目!
php实现并发的方法:首先写好针对第三方的请求接口;然后使用并发请求这些第三方的接口,并发代码如“function request(){}”;最后使用php实现循环请求接口即可。
推荐:《PHP视频教程》
php实现并发
使用场景
如果你第三方的多个接口,需要循环请求,这时候就需要并发处理,因为 php 是单进程,顺序执行的程序,如果有一个接口挂了,那么后面的接口也不能得到请求,或者某个接口等待时间过长,下面的接口也需要等待时间,那么十多个接口每个接口等待1S,十个接口就需要10S才能完成一次请求。这时候,就需要使用并发请求
使用方案
可以先写好针对某个第三方的请求接口,然后使用并发请求这些第三方的接口
并发代码
function request(){
$srart_time = microtime(TRUE);
$webSiteUrl = 'http://test/';
/
结算
/
$alls = [
$webSiteUrl "1php",
$webSiteUrl "2php",
];
//1 创建批处理cURL句柄
$chHandle = curl_multi_init();
$chArr = [];
//2创建多个cURL资源
foreach ($alls as $Url) {
$chArr[$Url] = curl_init();
curl_setopt($chArr[$Url], CURLOPT_URL, $Url);
curl_setopt($chArr[$Url], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chArr[$Url], CURLOPT_TIMEOUT, 1);
curl_multi_add_handle($chHandle, $chArr[$Url]); //2 增加句柄
}
$active = null;
/常量
CURLM_CALL_MULTI_PERFORM==-1
// CURLM_OK == 0
/
do {
$mrc = curl_multi_exec($chHandle, $active); //3 执行批处理句柄
} while ($mrc == CURLM_CALL_MULTI_PERFORM); //4
//4 $active 为true,即$chHandle批处理之中还有$ch句柄正待处理,$mrc==CURLM_OK,即上一次$ch句柄的读取或写入已经执行完毕。
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($chHandle) != CURLM_CALL_MULTI_PERFORM) {//$chHandle批处理中还有可执行的$ch句柄,curl_multi_select($chHandle) != -1程序退出阻塞状态。
do {
$mrc = curl_multi_exec($chHandle, $active);//继续执行需要处理的$ch句柄。
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
foreach ($chArr as $k => $ch) {
// $result[$k] = curl_multi_getcontent($ch); //5 获取句柄的返回值,不需要
curl_multi_remove_handle($chHandle, $ch);//6 将$chHandle中的句柄移除
}
curl_multi_close($chHandle); //7 关闭全部句柄
$end_time = microtime(TRUE);
echo sprintf("use time:%3f s", $end_time - $srart_time);
}php 实现循环请求接口
这种情况针对的是循环需要在1S内执行的程序,如果执行频率超过1S,则直接使用linux 的计划任务即可
// 无时间限制执行此程序
set_time_limit(0);
// 设置默认时区 北京时间
date_default_timezone_set('PRC');
do {
// 如果不存在 stop 文件,则程序停止 并且记录停止时间
if (!file_exists(dirname(__FILE__) '/stop')) {
$handle = fopen('/ceshilog', 'a+');
fwrite($handle, '程序停止时间: ' date('Y-m-d H:i:s') "
");
fclose($handle);
exit();
}
sleep(4);
try {
requestNewOpen();
} catch (Exception $exception) {
$handle = fopen('/ceshilog', 'a+');
fwrite($handle, 'catch : ' $exception->getMessage() "
");
fclose($handle);
}
} while (true);
PHP有什么好的方式实现微服务架构?
本文2023-09-29 14:47:08发表“资讯”栏目。
本文链接:https://www.lezaizhuan.com/article/134697.html