PHP AJAX Response Handler
Read more at https://www.phpclasses.org/package/12275-PHP-Process-AJAX-requests-with-response-handlers.html#2021-11-26-01:39:27
In this episode of "PHP Internals News" we're looking back at all the RFCs that we discussed on this podcast for PHP 8.1. In their own words, the RFC authors explain what these features are, with your host interjecting his own comments on the state of affairs.
The RSS feed for this podcast is https://derickrethans.nl/feed-phpinternalsnews.xml, you can download this episode's MP3 file, and it's available on Spotify and iTunes. There is a dedicated website: https://phpinternals.news
Hi, I'm Derick, and this is PHP internals news, a weekly podcast dedicated to demystifying the development of the PHP language.
This is episode 95. I've been absent on the podcast for the last few months due to other commitments. It takes approximately four hours to make each episode. And I can now unfortunately not really justify spending the time to work on it. I have yet to decide whether I will continue with it next year to bring you all the exciting development news for PHP 8.2.
However, back to today, PHP eight one is going to be released today, November 25. In this episode, I'll look back at the previous episodes this year to highlight a new features that are being introduced in PHP 8.1. I am not revisiting the proposals that did not end up making it into PHP 8.1 feature two features I will let my original interview speak. I think you will hear Nikita Popov a lot as he's been so prolific, proposing and implementing many of the features of this new release. However, in the first episode of the year, I spoke with Larry about enumerations, which he was proposing together with Ilija Tovilo. I asked him what enumerations are.
Enumerations, or enums, are a feature of a lot of programming languages. What they look like varies a lot depending on the language, but the basic concept is creating a type that has a fixed finite set of possible values. The classic example is booleans. Boolean is a type that has two and only two possible values true and false. Enumerations are way to let you define your own types like that, to say this type has two values Sort Ascending or Sort Descending. This type has four values for the four different card suits, and a standard card deck. Or a user can be in one of four states pending, approved, cancelled or active. And so those are the four possible values that this variable type can have. What that looks like varies widely depending on the language. In a language like C or C++, it's just a thin layer on top of integer constants, which means they get compiled away to introduce at compile time, and they don't actually do all that much they're a little bit to help for reading. On the other end of the spectrum, you have languages like rust or Swift, where enumerations are a robust, advanced data type and data construct of their own. That also supports algebraic data types. We'll get into that a bit more later. And is a core part of how a lot of the system actually works in practice, and a lot of other languages are somewhere in the middle. Our goal with this RFC is to give PHP more towards the advanced end of enumerations. Because there are perfectly good use cases for it, so let's not cheap out on it.
In the next episode, I spoke with Aaron Piotrowski about another big new feature: fibres.
A few other languages already have Fibers like Ruby. And they're sort of similar to threads in that they contain a separate call stack and a separate memory stack. But they differ from threads in that they exist only within a single process and that they have to be switched to cooperatively by that process rather than pre-emptively by the OS like threads. And so the main motivat
Truncated by Planet PHP, read more at the original (another 16365 bytes)
State of the Word 2021 is just around the corner!
Although attending State of the Word in person would be ideal, not all WordPress community members get to enjoy the experience of attending the speech live with friends.
This year, as State of the Word is streamed live for the second time, we want to restore that in person camaraderie through State of the Word watch parties for WordPress Community members around the world.
We encourage WordPress meetup organizers and community members worldwide to (safely) host State of the Word 2021 watch parties —read this handbook to learn more.
You can choose to host a watch party online or in person.
The simplest way to organize an online watch party is to schedule an online event for your WordPress group and add the State of the Word YouTube streaming link directly on Meetup.com. Alternatively, you can schedule an online meeting using tools like Zoom and broadcast the live stream over there by screen sharing––thereby facilitating better engagement.
If your region meets the guidelines for in person events (if vaccines and testing are freely available), you can organize an in person watch party event (for fully vaccinated OR recently tested OR recently recovered folks) for your WordPress Meetup! Group members can hang out together (following local safety guidelines of course) and watch State of the Word live.
If your Local WordPress Meetup is organizing an in person watch party, fill out this form so that we can ship some swag for your group to celebrate!
Deadline: November 30, 2021
Excited? To help you get started, we’ve put together a few resources:
NOTE: The guidelines in this post are primarily aimed at WordPress Meetup organizers. However, you do not need to be a Meetup organizer to schedule a watch party! You can simply hang out together with your friends online or in person (while following local safety guidelines) and catch the event live!
If you are planning a watch party for State of the Word, and have questions, please drop us an email to: support@wordcamp.org if you have any questions. We are happy to help you in the best way possible.
The following folks contributed to this post: @anjanavasan @eidolonnight @evarlese and @rmartinezduque
Structured data (sometimes called “Schema” or “microdata”) has emerged as an important part of SEO strategy. Search engines are making use of this information to enhance listings and provide users with more immediate answers.
Even if you’re not 100% sure what structured data is, you’ve undoubtedly run across it in Google. For instance, a search for “Fantastic Beasts: The Crimes of Grindelwald” brings up a wealth of information. I can see where the movie is playing, its listing on IMDB, and aggregate reviews. Much of this comes from structured data that is being pulled from multiple websites.
But this goes beyond just finding the latest movie listings. Structured data can help almost any business, from restaurants to pet stores and everything in-between. Helpful info such as business hours, cafe menus and addresses are just a few examples of what can be mined. That’s really just the tip of the iceberg. To get a better sense of the types of data being used, check out Schema.org’s website.
So, how do you get started? In general, structured data requires adding some attributes to your site’s HTML tags. But thanks to some terrific WordPress plugins, we don’t have to do this manually. Instead, the plugins below provide an easy way to add your website to this data powerhouse.
With support for over 500 Schema types and sub-types, WPSSO core can provide structured data in many popular formats. It works with Facebook Open Graph, Google Rich Results/Knowledge Graph, Twitter Cards, oEmbed, Slack – among others.
The plugin will automatically read your site’s content and third-party APIs, then generate the appropriate data. A premium version adds support for WooCommerce, Google Merchant Feed, and several popular WordPress plugins.
Schema will add valid markup to your WordPress website and supports a variety of data types. It’s a great option for publishers, as it will enhance articles, blog posts, multimedia content and author profiles.
Need more? There are free extensions for marking up reviews and setting a default image.
Structured data spans a vast number of categories. But what if you just want to share basic business information? Business Profile will do exactly that, without all the extras you don’t need.
Enter your business name, hours, etc., and the plugin will generate a “Contact Card” widget that you can place anywhere via a shortcode. It’s an easy way to share your business info with search engines. Support for reviews can also be added via a free companion plugin.
For those who really want to micromanage their site, WP SEO Structured Data Schema offers options galore. An options panel will appear on individual pages and posts to let you tweak a plethora of items to your heart’s content.
The available pro version ups the ante by auto-filling page/post data, support for custom post types and more data types.
Though a little light on documentation, Markup (JSON-LD) is a fairly straightforward plugin for adding structured data. Within its settings panel, you can choose from a number of different types of data (Article, Blog Post, Event, Local Business, Site Navigation – among others).
Simply click on the data types you want, enable them and tweak settings. While there isn’t much in the way of plugin-specific info, each data type features some helpful Schema.org/Google links for further information.
With Schema & Structured Data for WP & AMP, you have a comprehensive plugin that is both highly-tweakable and easy to use. For instance, you can conditionally display markup fields based on a number of criteria, such as post type.
It’s also compatible with Google AMP, putting you into the good graces of the search behemoth.
Schema App Structured Data is another great choice if you prefer something that doesn’t require a complicated setup. Once you activate the plugin and fill out a few basic details, all of your pages, posts, categories, and more will be automatically marked up with compliant Schema.
Optionally, you can also display breadcrumb navigation that will further enhance both your site and your SERP listing.
Adding structured data markup to your website helps users get the information they need with less hassle. Instead of having to comb through your website to find business hours, they can simply ask Google. This is especially important as voice-based search becomes more prevalent.
Users no longer have to attempt the dangerous combination of typing and driving. Talking to whichever virtual assistant they’re using will provide the answers they’re looking for.
While there are certainly some concerns that users will bypass your site altogether, providing access to this data at least keeps your business in the game. If your competitors share structured data and you don’t, you could lose some potential customers. Plus, the fact that website navigation can be mined could be of some benefit as well.
In short, structured data is too important to ignore. Thankfully, the plugins above can help make the process quick and easy.
The post 7 Free Plugins for Adding Structured Data to Your WordPress Website appeared first on Speckyboy Design Magazine.
Everyone wants to control their own destiny. For web designers, that means layouts that look great, code that works as intended, and clients who pay on time.
While we may wish for each of those things, reality usually plays out differently. Layouts aren’t always pixel-perfect, code breaks and clients – well, they’re human.
But it goes even further. The deeper you look, the more situations you’ll find that are out of your control.
This is especially tough for those of us who keep a tight grip on both our business and projects. When something is out of our sphere of influence, it’s easy to become frustrated. And that can harm virtually every aspect of your work. It may even creep into your personal life as well.
That’s why the ability to cope with these situations is vital. By saving yourself from obsessing over something you can’t control, you’ll have more energy to focus on being positive and productive.
Let’s look at a few difficult-to-control situations that typically impact web designers. Along the way, we’ll discuss some methods for letting go in a healthy manner.
If you’ve worked in this industry for a few years, you may have gotten an unexpected email from a client that goes something like this:
“Hi,
We wanted to let you know that we are in the process of building a new website. It should be ready in the next few weeks. Could you work with our new designer to help with the transition?
It was great working with you!
Your Ex-Client”
This is frustrating on a few different levels. First and foremost, it hurts that you didn’t get a chance to even discuss the project. On top of that, your soon-to-be ex-client expects you to work on the transition away from your services.
Clients will come and go – that’s just part of doing business. However, it’s particularly difficult when someone blindsides you like this.
As it turns out, you had no warning and zero control. If you had just been able to pitch an idea or two, maybe things would have turned out differently? These are the types of thoughts likely racing through your head after reading such a letter.
True, the damage has already been done. And while you can angrily fire off a one or two-word reply to your client, that’s not going to help the situation.
On the bright side, this could be a great learning opportunity. Reply with a few politely-asked questions, such as:
Much of what you ask will depend on the client and the project. But this is a solid place to start. The idea is to get inside your client’s head a bit and find out what went into their decision.
And while not everyone will provide answers, the ones who do can prove valuable. You may find that your services were lacking in some areas. Or, perhaps the client’s cousin is the “new designer”. Either way, it’s better than pounding your fist over the situation.
So much of what web designers do these days depends on third-party providers. That could be anything from web hosting, plugins, themes, or email delivery services. In other words – a big piece of a website’s ability to function or be accessed at all is run by someone else.
A failure at any one of these links in the chain can be disastrous. To illustrate the point, think about what happens when a content delivery network (CDN) has an outage. That could bring down a massive number of websites.
Meanwhile, web designers are left without much (if any) control. On one hand, you have an understandably frustrated client. On the other is a company that dropped the ball. Oh, look – there’s you in the middle!
In this type of situation, every second can feel like an eternity. There might be an opportunity to switch to a different product, but that’s not always feasible. If the issue is prolonged, tension continues to grow on all sides.
Maybe you can’t control an outage or even a troublesome line of code. But there are some things you can do proactively.
Working with the provider’s technical support can at least make you feel like you’re in the game. By getting the status of the situation, there’s an opportunity to pass it along to affected clients.
What’s more, any troubleshooting information you can offer also has value. Who knows? If it leads to a resolution, you can say you were part of the process.
This one often hurts on a personal level. We web designers tend to fall in love with tools and applications that allow us to get things done. Perhaps it’s a favorite design app like Photoshop or a content management system (CMS) such as WordPress.
When apps change, those changes are inevitably forced onto us, as well. They impact our workflow – and not always in the most positive way.
All it takes is a quick look around support forums and social media to see the frustration. Users go on about how the feature they loved was “ruined” or that things will never be the same. We’ve all seen it and, at one time or another, been a part of that collective disappointment.
The first coping strategy is to give such changes a chance to sink in. Even if your first impression of them wasn’t favorable, it can take time to build a comfort level. A feature that may have frustrated you at first could become positive after more exposure.
Second, you might reach out to the developer and let them know how you feel. Maybe it doesn’t result in an immediate remedy, but at least you get it off of your chest. And if enough people feel the same way, there’s a chance that things evolve more acceptably.
If all else fails, perhaps it’s time to find a suitable alternative. Sometimes, your relationship with a tool simply runs its course.
In a profession where we aim to control all the variables, having the opposite can be maddening.
But, think of it this way: even if you could control every aspect of your work, would you even want to? It’s a major responsibility and more stress than most of us can bear.
Somewhere along the line, you have to put a level of trust in others. Whether that’s trusting a client, a software developer, or a service provider – they are often necessary rungs on the ladder to a successful business.
There will be failures and disconnects along the way. And, while it would be nice to have a measure of control over them, it’s also a bit unrealistic.
However, lack of control doesn’t mean that you have to give up all hope. Instead, look for ways to learn from the situation. The knowledge and experience you gain will serve you long into the future.
The post How Web Designers Can Cope with Situations Out of Their Control appeared first on Speckyboy Design Magazine.
WordPress 5.9 is expected to be a ground-breaking release. It will introduce the next generation of themes with Twenty Twenty-Two joining the fun and over 30 theme blocks to build all parts of your site. In anticipation of the January 25th release, we hope you enjoy this sneak peek of 5.9.
New design tools will allow you to create exactly what you want, from adding filters to all your images to fine-tuning the border radius on all your buttons. With WordPress 5.9 providing more design control along with streamlined access to patterns, you can easily change the entire look and feel of your site without switching themes.
No matter what you’re editing, whether it’s crafting a new post or working on a header, improvements to List View make it simple to navigate content regardless of complexity. More improvements and features for everyone are to come in this release and we can’t wait to see what you create with WordPress 5.9!
Stay tuned for more updates as the date draws near. If you want to help, the best thing you can do is test everything! For all the details, check out this Make Core post.
Video props: @annezazu (also co-wrote the post) @michaelpick @matveb @beafialho @javiarce @critterverse @joen.
Latest PECL Releases:
PhalconAcl
:PhalconAclComponentAware
to PhalconAclComponentAwareInterface
PhalconAclRoleAware
to PhalconAclRoleAwareInterface
#15691
require
to require_once
in PhalconLoader
to avoid conflicts with other loaders #15489
require
to require_once
in PhalconCliConsole
and PhalconMvcApplication
for a bit of extra performance #15489
PhalconCollection
has been moved under the Support
namespace:PhalconCollection
to PhalconSupportCollection
PhalconCollectionException
to PhalconSupportCollectionException
PhalconCollectionReadOnly
to PhalconSupportCollectionReadOnly
PhalconCollection
to PhalconSupportCollection
#15700
PhalconSessionBag
:PhalconSessionBag::construct
to accept a container instead of internally calling the defaultPhalconSessionBag::construct
to throw an exception if the container is not specifiedPhalconSessionBag::init
to store the data in the session #15494
PhalconEventsEvent::construct()
to allow source
to be nullable #15133
PhalconCrypt
PhalconCryptException
to PhalconCryptExceptionException
PhalconCryptMismatch
to PhalconCryptExceptionMismatch
authTag
with the encryption string and process it with the decryption string #15717
PhalconEncryption
PhalconCrypt
to PhalconEncryptionCrypt
PhalconSecurity
to PhalconEncryptionSecurity
Security
namespace under Encryption
SecurityJWTExceptionsUnsupportedAlgorithmException
to EncryptionSecurityJWTExceptionsUnsupportedAlgorithmException
SecurityJWTExceptionsValidatorException
to EncryptionSecurityJWTExceptionsValidatorException
SecurityJWTSignerAbstractSigner
to EncryptionSecurityJWTSignerAbstractSigner
SecurityJWTSignerHmac
to EncryptionSecurityJWTSignerHmac
SecurityJWTSignerNone
to EncryptionSecurityJWTSignerNone
SecurityJWTSignerSignerInterface
to EncryptionSecurityJWTSignerSignerInterface
SecurityJWTTokenAbstractItem
to EncryptionSecurityJWTTokenAbstractItem
SecurityJWTTokenEnum
to EncryptionSecurityJWTTokenEnum
SecurityJWTTokenItem
to EncryptionSecurityJWTTokenItem
SecurityJWTTokenParser
to EncryptionSecurityJWTTokenParser
SecurityJWTTokenSignature
to EncryptionSecurityJWTTokenSignature
SecurityJWTTokenToken
to EncryptionSecurityJWTTokenToken
SecurityJWTBuilder
to EncryptionSecurityJWTBuilder
SecurityJWTValidator
to EncryptionSecurityJWTValidator
SecurityJWTValidator
to EncryptionSecurityJWTValidator
SecurityException
to EncryptionSecurityException
SecurityRandom
to EncryptionSecurityRandom
#15729
PhalconCryptCrypt::getHashAlgo()
to PhalconCryptCrypt::getHashAlgorithm()
PhalconCryptCrypt::getAvailableHashAlgos()
to PhalconCryptCrypt::getAvailableHashAlgorithms()
PhalconCryptCrypt::setHashAlgo()
to PhalconCryptCrypt::setHashAlgorithm()
#15717
PhalconFactoryAdapterFactory::getAdapters()
to PhalconFactoryAdapterFactory::getServices()
#15717
PhalconCryptCrypt::__construct()
to have useSigning
set to true
by default #15717
PhalconConfig
PhalconConfig
to PhalconConfigConfig
PhalconConfigConfig::path
by making the delimiter
parameter a string
PhalconConfigAdapterIni::__construct
to not accept null
as the mode. The default is now INI_SCANNER_NORMAL
(2)PhalconDbAdapterAdapterInterface::getInternalHandler()
and PhalconDbAdapterPdoAbstractPdo::getInternalHandler()
to return var
instead of PDO
for custom adapters with different engines #15119
PhalconFilter
to PhalconFilterFilter
; added more tests #15726
PhalconMvcModel::getPreparedQuery()
to return QueryInterface
instead of Query
#15562
PhalconCache
to PhalconCacheCache
#15728
PhalconFactoryAdapterFactory
to define the factory exception in getExceptionClass()
instead of a property. #15728
PhalconDbAdapterAbstractAdapter::getSqlVariables()
to PhalconDbAdapterAbstractAdapter::getSQLVariables()
to align with the rest of the getSQL*
methods #15637
PhalconLogger
to PhalconLoggerLogger
#15727
PhalconEscaper
PhalconEscaper
to PhalconHtmlEscaper
PhalconEscaperEscaperInterface
to PhalconHtmlEscaperEscaperInterface
PhalconEscaperException
to PhalconHtmlEscaperException
escapeCss()
becomes css()
escapeJs()
, becomes js()
escapeHtml()
becomes html()
escapeHtmlAttr()
becomes attributes()
escapeUrl()
becomes url()
setHtmlQuoteType()
becomes setFlags()
#15757
PhalconEncryptionSecurity::hash()
to also use password_hash()
and accept ARGON2*
algorithms #15731
realClassName
in PhalconMvcRouterRoute::getRoutePaths()
if definition is string to make processing same as if array definition #15067
PhalconValidation::getValue()
behavior to get value from data
if not found in entity
. #14203
PhalconFormsForm::isValid()
signature: added whitelist
argument. #14203
PhalconSupportCollectionReadOnly
to PhalconSupportCollectionReadOnlyCollection
to avoid conflicts with the read-only feature in PHP 8.1 #15767
PhalconText
- replaced by PhalconSupportHelperStr*
#15776
PhalconHelperArr
- replaced by PhalconSupportHelperArr*
#15776
PhalconHelperFile
- replaced by PhalconSupportHelperFile*
#15776
PhalconHelperJson
- replaced by PhalconSupportHelperJson*
#15776
PhalconHelperNumber
- replaced by PhalconSupportHelperNumber*
#15776
PhalconHelperStr
- replaced by PhalconSupportHelperStr*
#15776
PhalconText
, PhaconHelper*
from the code replacing it with PhalconSupportHelper*
#15776
phalcon/phalcon
thus increasing coverage #15776
PhalconAssetsManager
to require a PhalconHtmlTagFactory
in its constructor #15776
PhalconEventsAbstractEventsAware
class to handle the Events Manager when necessary #15691
PhalconAclAdapterAdapterInterface::getInheritedRoles()
and PhalconAclAdapterMemory::getInheritedRoles()
that returns the inherited roles based on a passed role name (or all if no parameter supplied) #15154
PhalconCrypt
PhalconCryptPaddingPadInteface
and padding adaptersPhalconCryptPaddingAnsi
PhalconCryptPaddingIso10126
PhalconCryptPaddingIsoIek
PhalconCryptPaddingNoop
PhalconCryptPaddingPadInterface
PhalconCryptPaddingPkcs7
PhalconCryptPaddingSpace
PhalconCryptPaddingZero
PhalconCryptPadFactory
to easily create padding adaptersPhalconCacheAdapter*::setForever()
and PhalconStorageAdapter*::setForever()
to allow storing a key forever #15485
PhalconEncryptionSecurity::getHashInformation()
to return information for a hash #15731
PhalconEncryptionSecurity::CRYPT_ARGON2I
and PhalconEncryptionSecurity::CRYPT_ARGON2ID
#15731
allowEmpty
checks to common validators #15515
PhalconFormsForm::getFilteredValue()
to get filtered value without providing entity #15438
PhalconFormsForm::setWhitelist()
and PhalconFormsForm::getWhitelist()
#14203
dirtyState
serialization in PhalconMvcModel
#15571
PhalconHtmlTagFactory
(call service as a method) #15776
PhalconSupportHelperFactory
(call service as a method) #15776
PhalconHtmlHelperDoctype
helper for doctype
generation #15776
style
or link
tag option for PhalconHtmlHelperStyle
#15776
Query::getExpression()
return type #15553
PhalconMvcModel::getRelated()
to correctly return relationships (cached or not) when the foreign key has changed #15649
PhalconDbAdapterPdo*
, PhalconMvcModel
and PhalconMvcModelMetaDataStrategyAnnotations
to treat BIGINT
numbers as string #15632
PhalconCryptCrypt::decrypt()
to correctly calculate the hash when using signed mode #15717
PhalconMvcModelManager::isVisibleModelProperty()
to correctly check if setting property is visible #15276
PhalconConfigConfig::merge
to retain numeric indexes in deep merges #14705
phpinfo()
#15269
PhalconStorageAdapterRedis::getAdapter()
and PhalconCacheAdapterRedis::getAdapter()
to accept the connection timeout in the constructor options
#15744
PhalconDbAdapterAbstractAdapter::getSQLVariables()
to return an empty array when initialized #15637
PhalconCacheAdapter*
and PhalconStorageAdapter*
to delete a key when set()
is called with a zero or negative TTL #15485
PhalconDbAdapterPdoMysql
to not use PDO::ATTR_EMULATE_PREPARES
and PDO::ATTR_STRINGIFY_FETCHES
by default. This allows numbers to be returned with resultsets instead of strings for numeric fields #15361
PhalconValidationValidatorFile
to use messageFileEmpty
#14928
PhalconDbRawValue
usage bugs in PhalconMvcModel::doLowUpdate()
#15413
type
attribute for stylesheet links #15776
PhalconDebug
to not throw an exception if a URL service is not present #15381
PhalconKernel
- obsolete #15776
This release adds support for exponential backoff w/jitter, experimental support for detecting a dirty connection, as well as many other fixes and improvements.
You can find a detailed list of changes in Changelog.md and package.xml or by inspecting the git commit logs.
--- Sponsors ---
Audiomack - https://audiomack.com Open LMS - https://openlms.net BlueHost - https://bluehost.com Object Cache Pro for WordPress - https://objectcache.pro Avtandil Kikabidze - https://github.com/akalongman Zaher Ghaibeh - https://github.com/zaherg BatchLabs - https://batch.com Luis Zarate - https://github.com/jlzaratec
Fixed segfault in redis_setoption_handler [692e4e84] (Pavlo Yatsukhnenko)
Fix masters array in the event of a cluster failover [bce692962] (Bar Shaul)
Fix 32 bit type error [672dec87f] (Remi Collet)
Fix radix character in certain locales [89a871e24] (Pavlo Yatsukhnenko)
ZSTD Validation fix [6a77ef5cd] (Michael Grunder)
Remove superfluous typecast [b2871471f] (Remi Collet)
Updated documentation [f84168657, d017788e7, 20ac84710, 0adf05260, aee29bf73, 09a095e72, 12ffbf33a, ff331af98, a6bdb8731, 305c15840, 1aa10e93a, d78b0c79d, c6d37c27c, a6303f5b9, d144bd2c7, a6fb815ef, 9ef862bc6] (neodisco, Clement Tessier, T. Todua, dengliming, Maxime Cornet, Emanuele Filannino Michael Grunder)
Travis CI Fixes [a43f4586e, 4fde8178f, 7bd5415ac, fdb8c4bb7, d4f407470] (Pavlo Yatsukhnenko)
Minor fixes/cleanup [2e190adc1, 99975b592, 9d0879fa5, 22b06457b] (Pavlo Yatsukhnenko)
Fix RedisArray constructor bug 85dc883ba (Pavlo Yatsukhnenko)
Moved to GitHub Actions [4d2afa786, 502d09fd5] (Pavlo Yatsukhnenko)
Use more appropriate array iteration macro [6008900c2] (Pavlo Yatsukhnenko)
Clean up session tests [ab25ae7f3] (Michael Grunder)
RedisArray refactors [1250f0001, 017b2ea7f, 37ed3f079] (Pavlo Yatsukhnenko)
Use zend_parse_parameters_none helper [a26b14dbe] (Remi Collet)
Support for various exponential backoff strategies [#1986, #1993, 732eb8dcb, 05129c3a3, 5bba6a7fc], (Nathaniel Braun)
Added experimental support for detecting a dirty connection [d68579562] (Michael Grunder)
Created distinct compression utility methods (pack/unpack) [#1939, da2790aec] (Michael Grunder)
SMISMEMBER Command [#1894, ae2382472, ed283e1ab] (Pavlo Yatsukhnenko)