php单例怎么操作 总是有人在黑php,这是怎样的一群人?
总是有人在黑php,这是怎样的一群人?
PHP现在名声不好,因为它曾经是 "可怕 "。
这篇文章试图回答一些关于PHP的常见论断,以便向非技术人员说明PHP并没有很多人说的那么差。
1.它是否鼓励不良做法?
不再是了。以前很多开发者都是被书本教会了非常不好的做法,所以PHP代码质量非常差。PHP曾经允许你做一些非常奇怪的事情,这使得构建非常容易,但是维护起来却是一场噩梦。
这些不再是常见的问题。随着高质量学习资料的引入,这些资料很容易学习和获取,一个新的开发者可以用正确的方法学习PHP。这可以防止初级开发人员编写一些维护起来非常痛苦的代码,因为他们没有 我不知道建造东西的正确方法。
随着框架的引入,大部分导致许多糟糕体验的常见代码现在都自动完成了;所以开发者只需要使用框架,框架就能正确编码。
而且这些年来,一些不好的做法都是因为缺失了特性,导致了一些不应该被允许的事情。现在大多数情况下,甚至无法意识到之前写的东西会导致这个名声。
总结
它不再鼓励不良行为...
使用框架可以避免不好的实践。
现在有很多关于语言特性的讨论。不再支持不好的功能。
PHP添加了其他语言中存在的大部分(如果不是全部)功能。
2.它的安全性差吗?
过去,PHP应用程序的安全性通常很差,因为语言允许这样做。这些东西已经不用了,因为现在PHP应用的开发已经完全不同了。
通过使用自动加载器来包含文件,而不是动态地包含文件,远程和本地文件包含(PHP从原始地址以外的其他地址读取文件)。
通过广泛使用模板系统(可以自动处理显示动态内容的转义和安全问题),避免了在PHP中直接使用HTML(一个用户将JavaScript脚本添加到要显示给另一个用户的地方)导致的跨站脚本攻击。
通过在SQL中使用预处理语句,可以避免SQL注入攻击(这是由于需要构建SQL查询并一起发送查询和数据,用户可以在查询中添加额外的SQL命令)。另外,ORM的应用也很广泛,它保证了用户数据和查询是分开发送的,SQL不能把它当成一个单独的命令。
通过广泛使用nonce系统的表单库,可以避免跨站点请求伪造(其中用户可以被诱骗在您的站点上执行某些操作)。
总结
通过使用自动加载器(所有主流框架),避免包含远程和本地文件。
通过使用模板语言作为标准或前端框架(如React),可以避免跨站点脚本(XSS)攻击。
通过使用ORM和广泛使用预准备语句来避免SQL注入。
通过使用nonce令牌(所有主流框架都自动支持),可以避免跨站点请求伪造(CRSF)攻击。
3.真的很慢吗?
那要看你拿它和什么比了。如果拿PHP和Java,C或者Go比,就慢一些。但是如果你拿PHP和Python,Ruby之类的比较,并不慢。PHP是同类语言中速度最快的语言之一,而且它还在不断提高自己的性能。
在大多数情况下,您的应用程序很慢是因为服务器过载或数据库查询很慢。这些问题在任何语言中都会存在。
总结
PHP比编译语言慢。
PHP比其他脚本语言更快。
网站慢通常不是因为没有快速语言,而是服务器或数据库造成的性能问题。
4.它的扩展性真的很差吗?
事实上,任何语言都是可以缩放的。编译语言(如Go、C或Rust)的扩展成本比脚本语言(如PHP)低。但是,它们不是为同一任务而设计的。其实都一样;这仅仅取决于您使用的服务器数量。如果您使用足够多的服务器,您可以扩展任何应用程序。PHP比其他脚本语言的扩展成本更低,因为它启动运行需要的资源更少,可以运行在CPU更多内存更小的服务器上。
此外,对于可伸缩性,数据库很重要。如果可以扩展数据库,就可以扩展应用程序。数据库比应用服务器更难扩展。很容易添加另一个读取数据库的客户机;然而,使数据库快速运行要困难得多。
总结
任何语言都可以是可扩展的;这取决于您使用多少台服务器。
扩展的真正问题是数据库,而不是使用的应用程序语言。
如果你能扩展你的数据,你就能扩展你的应用。
5.我应该一直用它吗?
不是。每种编程语言都有自己的专业领域。PHP非常适合Web应用。你应该用它来构建网站和API。
如果您正在构建一个系统应用程序,其中每一毫秒都很重要,请使用Rust或c。
如果你正在构建一个人工智能应用,Python是一个很好的选择。
如果您正在构建一个SaaS应用程序,PHP是一个不错的选择。
如果您正在构建一个Android应用程序,Kotlin是一个不错的选择。
如果你正在建造Java是构建在多种平台上运行的应用程序的好选择。
总结
每种语言都有其最佳用例。
PHP的最佳用例是Web应用程序。
Go,Rust,c适合系统应用。
Python适合人工智能。
Kotlin适用于Android应用程序。
Java适合于平台无关的应用程序。
6.结论
每年都讲php,但是你的PHP现在是不是过期了?很多关于PHP的说法已经过时10年了。在我看来,如果有人给你一个过期10年的技术主题的信息,那么这个人可能不是你想要信任的技术专家。
PHP是创建W
set nx函数用法?
在Redis中,所谓的SETNX是 "如果不存在则设置 ",也就是只有在不存在的时候才能设置,用它来达到锁定的效果,但是很多人都没有意识到SETNX有陷阱!
比如一个查询数据库的接口,调用量很大,所以增加一个缓存,设置缓存过期后刷新。问题是,当并发量较大时,如果没有锁机制,大量并发请求会在缓存过期的瞬间穿透缓存,直接查询数据库,产生雪崩效应。如果有锁机制,那么只能控制一个请求来更新缓存,其他请求可以等待,也可以根据需要使用过期的缓存。
让 下面以PHP社区中最流行的PHPRedis扩展为例,实现一个演示代码:
服务器端编程语言(Professional Hypertext Preprocessor的缩写)
$ok $redis-setNX($key,$ value);
如果($ok) {
$ cache-update();
$ redis-del($ key);
}
当缓存过期时,通过SetNX获得锁。如果成功,更新缓存并删除锁。看起来逻辑很简单,但很遗憾有一个问题:如果请求执行因为某种原因意外退出,导致创建了锁但没有删除锁,那么这个锁就一直存在,这样以后缓存就永远不会更新了。因此,我们需要为锁添加一个到期时间,以防发生某些情况:
服务器端编程语言(Professional Hypertext Preprocessor的缩写)
$ redis-multi();
$redis-setNX($key,$ value);
$redis-expire($key,$ TTL);
$ redis-exec();
因为SetNX没有设置过期时间的功能,所以我们需要借助Expire来设置,需要用Multi/Exec来包装它们,保证请求的原子性,防止SetNX过期成功。e失败了。不幸的是,仍然存在问题:当多个请求到达时,尽管只有一个请求 s SetNX可以成功,任何要求 s Expire可以成功,这意味着即使不能获得锁,也可以刷新到期时间。如果请求密集,过期时间将一直刷新,导致锁一直有效。所以我们需要有条件地执行Expire,同时确保原子性,然后我们有下面的Lua代码:
本地关键码[1]
本地值键[2]
本地ttl密钥[3]
本地ok (setnx,key,value)
如果ok 1,则
(过期,密钥,ttl)
结束
返回ok
我没有。;t指望用Lua脚本实现一个看似简单的功能,真的很麻烦。事实上,Redis考虑了每个人 苦难。从2.6.12开始,SET已经涵盖了SETEX的功能,SET本身也已经包含了设置到期时间的功能,也就是说我们之前需要的功能,只有SET才能实现。
服务器端编程语言(Professional Hypertext Preprocessor的缩写)
$ok $redis-set($key,$value,array(nx,ex $ TTL));
如果($ok) {
$ cache-update();
$ redis-del($ key);
}
上面的代码完美吗?答案是差不多!想象一下,如果一个请求更新缓存需要很长时间,甚至比锁的有效期还要长,那么在缓存更新过程中锁就会失效,此时另一个请求就会获得锁。但是如果之前的请求在缓存更新完成后直接删除锁,那么其他请求创建的锁也会被误删除,所以我们需要在创建锁的时候引入一个随机值:
服务器端编程语言(Professional Hypertext Preprocessor的缩写)
$ok $redis-set($key,$random,array(nx,ex $ TTL));
如果($ok) {
$ cache-update();
if ($redis-get($key) $random) {
$ redis-del($ key);
}
}
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。