在PHP中执行Linux系统命令:实现强大的命令行交互

php 专栏收录该内容
¥59.90 ¥99.00
149篇文章

PHP是一种流行的服务器端脚本语言,而Linux是一种广泛使用的操作系统。在PHP中执行Linux系统命令可以为开发者提供更多的灵活性和功能。本文将详细介绍如何在PHP中执行Linux系统命令,并提供相应的源代码示例。

在PHP中执行Linux系统命令可以使用exec()函数或反引号操作符(``)来实现。这两种方法都可以执行系统命令并返回输出结果。下面将分别介绍这两种方法的使用。

  1. 使用exec()函数执行系统命令

exec()函数是PHP中用于执行外部命令的函数之一。它接受一个字符串参数,该参数就是要执行的系统命令。exec()函数执行命令后,将返回最后一行输出结果。

下面是一个使用exec()函数执行系统命令的示例:

$command = 'ls -l';
$output = exec
RCE漏洞实战:从PHP代码执行到Shell命令注入的靶场通关指南 命令执行(RCE)是Web安全领域的核心漏洞类型之一,它允许攻击者在目标服务器上执行任意系统命令,从而完全控制服务器。其原理通常源于应用程序未对用户输入进行充分过滤,直接将输入传递给危险函数(如PHP的eval()、system()),导致恶意代码被解释执行。这种漏洞的技术价值在于它直接突破了应用层边界,为后续渗透测试、数据窃取、横向移动等攻击铺平道路,常见于内容管理系统、Web应用框架及API接口中。本文聚焦于RCE-labs靶场的前5个关卡,通过实战演示如何利用PHP代码执行函数家族(如assert、c 阅读详情

相关推荐

PHP代码执行漏洞攻防:从基础原理到CTF实战绕过技巧

代码执行漏洞是Web安全领域的核心议题,它允许攻击者在服务器上执行任意代码,从而可能导致系统被完全控制。其原理在于应用程序未对用户输入进行充分过滤,将本应视为数据的内容错误地解析为代码执行。从技术价值看,理解代码执行漏洞的成因与防御,是构建安全应用、进行渗透测试和参与CTF竞赛的必备基础。在PHP环境中,这类漏洞常通过eval()、assert()等危险函数触发,而防御方则通过正则表达式黑名单过滤危险字符和函数名。攻击者为了绕过过滤,会运用一系列技巧,例如利用${IFS}或重定向符<替代被禁的空格,使用通配

abcyan1235的博客 405

RCE绕过实战:从PHP代码执行到Shell通配符的深度渗透技巧

远程代码执行(RCE)是Web安全领域的核心漏洞类型,攻击者通过注入恶意代码获取服务器控制权。其原理在于应用程序未对用户输入进行充分过滤,导致攻击者能够执行任意代码或系统命令。在实战中,WAF和输入过滤机制日益完善,因此深入理解编程语言特性和操作系统环境成为突破防线的关键。例如,通过PHP的字符串拼接、动态函数调用等特性,可以绕过关键字过滤;而利用Shell通配符(如*和?)和内部字段分隔符(如${IFS}),则能在系统命令执行层实现有效绕过。这些技术不仅适用于CTF竞赛,更能直接应用于真实环境的渗透测试与

congbao6525的博客 521

PHP命令执行漏洞:从基础绕过到grep信息泄露的实战指南

命令执行漏洞是Web安全领域的核心议题,它源于应用程序将未经验证的用户输入直接拼接至系统命令中执行。其原理在于操作系统Shell对输入的解释机制,攻击者通过注入特殊字符或命令分隔符,即可突破原有逻辑执行任意指令。这项技术的安全价值在于揭示了输入验证的极端重要性,并推动开发者采用更安全的编程范式。在渗透测试、CTF竞赛及安全评估等应用场景中,深入理解命令执行的绕过技巧,尤其是针对PHP环境的过滤机制,是攻防对抗的关键。本文将聚焦于PHP命令执行漏洞的实战对抗,系统剖析从基础字符替换到利用grep命令特性进行信

cri5768的博客 491

PHP伪协议安全风险深度解析:从文件读取到代码执行

在Web开发与安全领域,文件包含与数据流处理是基础且关键的技术概念。其核心原理在于程序如何通过统一接口访问不同来源的数据流,例如本地文件、网络资源或内存数据。PHP伪协议正是这一机制的实现,它通过封装器(Wrapper)为各种I/O操作提供了标准化接口。从技术价值看,伪协议极大增强了PHP处理数据的灵活性,但同时也引入了严重的安全风险,尤其是当用户输入未经严格过滤直接用于文件操作函数时。在应用场景中,开发者常利用伪协议进行文件读取、数据编码转换或压缩包处理,而攻击者则可能滥用php://filter进行源码

weixin_34242509的博客 373

SQL注入进阶:从数据库漏洞到系统命令执行的攻防实战

SQL注入是一种经典的Web安全漏洞,其核心原理在于攻击者通过构造恶意输入,篡改应用程序后端数据库查询语句的逻辑。这种漏洞的技术价值在于,它可能突破应用层防护,直接威胁底层数据安全与系统完整性。在特定应用场景下,当数据库管理系统(DBMS)提供了与操作系统交互的函数接口,且应用程序权限配置不当,SQL注入的危害可能从数据层面升级为系统命令执行。例如,攻击者可利用MySQL的INTO OUTFILE子句或MSSQL的xp_cmdshell存储过程,在服务器上执行任意命令,从而实现更高级别的渗透与控制。理解并防

weixin_33859844的博客 472

从eval代码执行漏洞到蚁剑实战:Web安全入门与PHP代码执行原理深度解析

代码执行是Web安全领域的核心概念之一,它指的是攻击者能够使目标服务器执行其注入的任意代码。其原理在于应用程序未对用户输入进行充分过滤,直接将数据拼接至可执行代码上下文中,导致数据被解析为指令。这种漏洞的技术价值在于,它往往是服务器沦陷的起点,攻击者可通过它执行系统命令、读取敏感文件或植入Webshell,最终完全控制服务器。在PHP开发中,eval()、assert()等函数是此类漏洞的典型代表,常出现在动态代码执行、模板渲染等场景。本文以PHP eval执行漏洞为切入点,结合蚁剑(AntSword)这一

weixin_30412167的博客 339

RCE漏洞深度解析:从命令执行到代码执行的攻防实战

在网络安全领域,远程代码执行(RCE)漏洞因其极高的危害性,始终是攻防对抗的焦点。其核心原理在于应用程序未能正确处理用户输入,模糊了数据与代码的边界,导致攻击者能够注入并执行恶意指令。从技术价值看,RCE漏洞的利用直接关系到系统的完整性与控制权,是渗透测试中获取服务器权限的关键路径。典型的应用场景包括Web应用对用户输入的直接拼接调用系统命令,或动态执行未经验证的代码片段,例如在PHP中使用eval()函数或在Java中触发不安全的反序列化。本文聚焦于命令执行与代码执行两大分支,通过剖析Struts2、We

weixin_30299709的博客 315

PHP 调用并执行 Linux 命令

PHP 调用并执行 Linux 命令

Cwillchris的博客 3152

PHP执行Linux系统命令的常用函数使用说明

在实际应用中,我们应该根据具体的场景选择合适的函数,并注意对用户输入进行过滤和验证,确保系统的安全性。在PHP中,我们经常需要与Linux系统进行交互,执行一些系统命令来完成特定的任务。在上述示例中,我们使用exec()执行了一个简单的ls -l命令,并将输出存储在$output数组中。在上述示例中,我们使用shell_exec()执行了一个简单的ls -l命令,并将输出保存在$output变量中。在上述示例中,我们使用system()执行了一个简单的ls -l命令,命令的输出直接打印到屏幕上。

BUG?不存在的! 183

php代码里执行linux命令(exec的使用)

虽然这篇很水,但是我还是打算写一下,我想以后应该会很有用 //监听任务并执行 public function start() { $res = exec("php -v"); $res = exec("php ../think queue:work"); dump($res); } 当执行start方法时,系统就会分别执行php -v和php …/think queue:work命令 如果您觉得本篇对你有帮助,可以点关注,给个赞,支持一下,过程有遇到什么问题也欢迎评.

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1096

Linux下使用Crontab运行PHP脚本

首先,我们编写要定时执行的PHP脚本,然后编辑Crontab文件,添加定时任务的配置。保存并退出编辑模式后,Crontab会自动按照配置的时间间隔执行我们的PHP脚本。Crontab是Linux系统中一个强大的定时任务管理工具,可以用于按照预定时间间隔执行指定的命令或脚本。你可以使用具体的数值表示要定时执行的时间,也可以使用通配符"*"表示任意值。在编辑完Crontab文件后,按下Ctrl键加字母"O"保存文件,然后按Ctrl键加字母"X"退出编辑模式。请根据你的需求,选择适合的定时任务配置。

KgyDeveloper的博客 300

手动搭建PHP环境:步步为营,解锁Web开发

本文详细介绍了不依赖安装套件、手动搭建PHP环境的完整步骤。内容涵盖Windows、Linux(以 Ubuntu 为例)、macOS三大操作系统,分别讲解了Web服务器(Apache/Nginx)、PHP解释器、数据库(MySQL/MariaDB)的安装方法,以及各组件间的集成配置,包括PHP与服务器关联、PHP连接数据库等关键操作。同时,文中提及版本兼容性注意事项和常见问题解决思路,帮助开发者深入理解环境运行原理,为PHP Web开发奠定扎实基础,适合希望掌握底层配置逻辑的开发者参考实践。

邓邓子的博客 1044

在Linux系统上配置Tomcat 6和PHP

在Linux系统上配置Tomcat 6和PHP可以为开发人员提供一个强大的Web开发环境。本文将详细介绍如何在Linux系统上配置Tomcat 6和PHP,并提供相应的源代码示例。例如,可以将其移动到。您现在可以通过Tomcat运行Java Web应用程序,并使用PHP开发动态网站。要将Tomcat与Apache Web服务器集成,可以使用Apache Tomcat连接器(mod_jk)。要配置Tomcat,需要编辑Tomcat的配置文件。,您将看到PHP信息页面,这表明PHP和Tomcat已成功集成。

PeGroovy的博客 395

从0到1:PHP环境搭建指南,解锁Web开发新姿势

本文详细介绍了 PHP 环境搭建的全流程,涵盖基础认知、工具选择及多系统实操。首先解析 PHP 在 Web 开发中的核心地位,强调环境搭建的基础性作用;接着对比 XAMPP、Wamp Server 等主流集成工具的特点与用法;随后分 Windows、macOS、Linux 系统,提供基于集成套件和手动安装的分步指南;最后针对 Apache 启动失败、PHP 脚本不执行等常见问题给出解决方案。无论新手还是有经验的开发者,都能通过本文快速掌握不同系统下 PHP 环境搭建的关键要点,为 Web 开发工作奠定基础。

邓邓子的博客 1552

在Linux上安装PHP

根据您的应用程序需求,您可能需要安装一些额外的PHP模块。例如,如果您计划使用MySQL数据库,则需要安装与MySQL集成的PHP模块。如果您的Web服务器(例如Apache或Nginx)正在运行,您需要重新启动服务器以使PHP生效。对于大多数情况,PHP的默认配置是足够的。但是,如果您需要进行一些自定义配置,您可以编辑PHP的配置文件。安装完成后,我们可以验证PHP是否成功安装。在打开的文件中,您可以编辑各种PHP的配置选项。接下来,我们将安装PHP及其相关的扩展。根据您的需求,可能需要安装其他模块。

UqConstruction的博客 263

12、Linux 使用指南:从桌面环境到命令行操作

本文全面介绍了 Linux 系统的各个方面,包括常见的桌面环境、命令行操作、生产力软件、编程语言支持、包管理系统以及在云计算中的应用。文章从基础入门到高级操作,涵盖了 Linux 的核心知识领域,并提供了命令行使用技巧、脚本编写基础以及常见问题的解决方法,旨在帮助用户更好地掌握 Linux 系统的使用与开发。

g2h3i4j5的博客 74

KIBANA可视化管理界面说明

更说明转自https://blog.youkuaiyun.com/IT_ZRS/article/details/125496588 1 主要结构功能 使用浏览器访问 ip:5601 默认端口,进入首页 Discover:日志管理视图 主要进行搜索和查询 Visualize:统计视图 构建可视化的图表 Dashboard:仪表视图 将构建的图表组合形成图表盘 Timelion:时间轴视图 随着时间流逝的数据 APM:性能管理视图 应用程序的性能管理系统 Canvas:大屏展示

tian830937的专栏 7081

告别手动复制粘贴!用Python脚本+pywinauto实现PC微信消息自动发送(附完整源码)

本文详细介绍了如何利用Python和pywinauto实现PC微信消息的自动化发送,告别繁琐的手动操作。从环境搭建、UI控件定位到构建健壮的发送流程,再到高级功能扩展和项目打包部署,全面解析了自动化办公的实现方案,显著提升工作效率。

weixin_30315723的博客 583

clang-tidy 使用指南

clang-tidy 需要一个编译数据库来了解如何编译你的代码。编译数据库通常是一个名为 compile_commands.json 的文件。在这个示例中,clang-tidy 会对 test.cpp 文件进行分析,并报告任何潜在的问题。例如,它可能会警告 test 函数中的未使用变量 x。clang-tidy 是一个用于 C++ 代码的静态分析工具,可以帮助你发现代码中的潜在问题和改进点。这将在 build 目录中生成一个 compile_commands.json 文件。

weixin_42244181的博客 2359

基于深度学习方法(7种)的高光谱与多光谱图像融合(附代码+3个数据集获取)

其他不懂的可以把代码发给AI哦,让它给你解读。

热爱分享,热爱记录 1297

Lammps模拟剪切作用下的位错滑移

Lammps模拟位错与障碍物作用。在lammps中实现周期性位错阵列模型模拟剪切作用下1/2刃位错与障碍物的交互作用

Rockyoung 3457

华为Ascend C算子开发能力认证(中级)(个人记录,有完整代码,已通过认证,仅供参考)

本文介绍了在昇腾NPU环境下实现Sigmoid算子的完整流程。首先需要在华为云ModelArts-Notebook或开发者套件上搭建环境,要求CANN版本为8.0.0.beta1。主要内容包括:1)实现SigmoidCustom算子的kernel侧核函数代码;2)完成host侧Tiling结构体实现;3)支持Float16数据类型。代码实现部分详细展示了核函数计算流程、数据拷贝和牛顿迭代优化方法。最后介绍了编译部署流程,包括环境配置、代码上传、编译执行等步骤,并提供了提交规范说明。该实现通过调用Ascend

qq_73044452的博客 1107

科研绘图系列:R语言折线图(linechart plots)

科研绘图系列:R语言折线图(linechart plots)

专注生信领域 1269

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: Smarty模板引擎是一种用于PHP的流行的模板引擎,它提供了一种将业务逻辑和显示逻辑分离的方式
下一篇: 使用HBase Thrift接口的常见问题及注意事项
普通网友
博客等级 码龄3年 32粉丝 0原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值