总是有人在黑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
setnx函数用法?
在redis中,所谓的setnx是"如果不存在则设置",也就是只有在不存在的时候才能设置,用它来达到锁定的效果,但是很多人都没有意识到setnx有陷阱!
比如一个查询数据库的接口,调用量很大,所以增加一个缓存,设置缓存过期后刷新。问题是,当并发量较大时,如果没有锁机制,大量并发请求会在缓存过期的瞬间穿透缓存,直接查询数据库,产生雪崩效应。如果有锁机制,那么只能控制一个请求来更新缓存,其他请求可以等待,也可以根据需要使用过期的缓存。
让下面以php社区中最流行的phpredis扩展为例,实现一个演示代码:
服务器端编程语言(professionalhypertextpreprocessor的缩写)
$ok$redis-setnx($key,$value);
如果($ok){
$cache-update();
$redis-del($key);
}
当缓存过期时,通过setnx获得锁。如果成功,更新缓存并删除锁。看起来逻辑很简单,但很遗憾有一个问题:如果请求执行因为某种原因意外退出,导致创建了锁但没有删除锁,那么这个锁就一直存在,这样以后缓存就永远不会更新了。因此,我们需要为锁添加一个到期时间,以防发生某些情况:
服务器端编程语言(professionalhypertextpreprocessor的缩写)
$redis-multi();
$redis-setnx($key,$value);
$redis-expire($key,$ttl);
$redis-exec();
因为setnx没有设置过期时间的功能,所以我们需要借助expire来设置,需要用multi/exec来包装它们,保证请求的原子性,防止setnx过期成功。e失败了。不幸的是,仍然存在问题:当多个请求到达时,尽管只有一个请求ssetnx可以成功,任何要求sexpire可以成功,这意味着即使不能获得锁,也可以刷新到期时间。如果请求密集,过期时间将一直刷新,导致锁一直有效。所以我们需要有条件地执行expire,同时确保原子性,然后我们有下面的lua代码:
本地关键码[1]
本地值键[2]
本地ttl密钥[3]
本地ok(setnx,key,value)
如果ok1,则
(过期,密钥,ttl)
结束
返回ok
我没有。;t指望用lua脚本实现一个看似简单的功能,真的很麻烦。事实上,redis考虑了每个人苦难。从2.6.12开始,set已经涵盖了setex的功能,set本身也已经包含了设置到期时间的功能,也就是说我们之前需要的功能,只有set才能实现。
服务器端编程语言(professionalhypertextpreprocessor的缩写)
$ok$redis-set($key,$value,array(nx,ex$ttl));
如果($ok){
$cache-update();
$redis-del($key);
}
上面的代码完美吗?答案是差不多!想象一下,如果一个请求更新缓存需要很长时间,甚至比锁的有效期还要长,那么在缓存更新过程中锁就会失效,此时另一个请求就会获得锁。但是如果之前的请求在缓存更新完成后直接删除锁,那么其他请求创建的锁也会被误删除,所以我们需要在创建锁的时候引入一个随机值:
服务器端编程语言(professionalhypertextpreprocessor的缩写)
$ok$redis-set($key,$random,array(nx,ex$ttl));
如果($ok){
$cache-update();
if($redis-get($key)$random){
$redis-del($key);
}
}
原文标题:php单例怎么操作 总是有人在黑php,这是怎样的一群人?,如若转载,请注明出处:https://www.bjtdsx.com/bjtdsx2/723.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「天地水秀」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。