<?xml version="1.0" encoding="UTF-8"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="en-US"
	>
	<title type="text">PHP Magazine Network</title>
	<subtitle type="text"></subtitle>

	<updated>2026-10-29T15:27:25Z</updated>

	<link rel="alternate" type="text/html" href="https://phpmagazine.net" />
	<id>https://phpmagazine.net/feed/atom</id>
	<link rel="self" type="application/atom+xml" href="https://phpmagazine.net/feed/atom" />

	<generator uri="https://wordpress.org/" version="7.1.4">WordPress</generator>
	<entry>
		<author>
			<name>Hatem Ben Yacoub</name>
							<uri>http://hbyconsusltancy.com</uri>
						</author>

		<title type="html"><![CDATA[The PHP Foundation Is Underfunded. The October Security Crisis Reveals Why That Matters]]></title>
		<link rel="alternate" type="text/html" href="https://phpmagazine.net/2026/10/php-foundation-underfunded-security-sustainability-2026.html" />

		<id>https://phpmagazine.net/?p=34750</id>
		<updated>2026-10-29T15:27:25Z</updated>
		<published>2026-10-29T15:27:22Z</published>
		<category scheme="https://phpmagazine.net" term="Business &amp; Career" /><category scheme="https://phpmagazine.net" term="Featured" /><category scheme="https://phpmagazine.net" term="News &amp; Trends" /><category scheme="https://phpmagazine.net" term="Cybersecurity" /><category scheme="https://phpmagazine.net" term="Elizabeth Barron" /><category scheme="https://phpmagazine.net" term="Open source" /><category scheme="https://phpmagazine.net" term="Open Source Funding" /><category scheme="https://phpmagazine.net" term="PHP" /><category scheme="https://phpmagazine.net" term="PHP Ecosystem" /><category scheme="https://phpmagazine.net" term="PHP Foundation" /><category scheme="https://phpmagazine.net" term="PHP Security" /><category scheme="https://phpmagazine.net" term="Software Sustainability" />
		<summary type="html"><![CDATA[A Question the Industry Can No Longer Ignore The PHP Foundation is not facing an immediate collapse according to its latest published annual financial report. It has reserves, dedicated contributors, established sponsors, and a strategy intended to improve its financial position. Yet those strengths should not obscure the underlying imbalance. The language serves a large [&#8230;]]]></summary>

					<content type="html" xml:base="https://phpmagazine.net/2026/10/php-foundation-underfunded-security-sustainability-2026.html"><![CDATA[

<p class="wp-block-paragraph"><strong>PHP powers a substantial part of the modern web, supporting everything from personal websites and online stores to business applications and government services. Yet the organization helping to maintain and secure the language operates with remarkably limited resources.</strong></p>



<p class="wp-block-paragraph">In an interview published by Reuters on October 23, 2026, Elizabeth Barron, Executive Director of The PHP Foundation, described an organization with just one full-time employee—herself—alongside 14 contractors, most of whom work part-time, and an unpaid volunteer board.</p>



<p class="wp-block-paragraph">Her assessment was clear: PHP remains severely underfunded relative to the importance of the technology and the number of organizations depending on it.</p>



<p class="wp-block-paragraph">The interview followed the emergency release of security patches addressing two critical vulnerabilities in PHP&#8217;s runtime. Together, these developments raise questions that extend far beyond the latest security incident: Who is responsible for maintaining critical open-source infrastructure? How should that work be financed? And can the existing model remain sustainable as security threats and development demands increase?</p>



<h2 class="wp-block-heading">A Language Used Across Much of the Web</h2>



<p class="wp-block-paragraph">PHP celebrated its 30th anniversary in 2025. Despite decades of competition from other programming languages and application platforms, it remains one of the most widely deployed server-side technologies.</p>



<p class="wp-block-paragraph">According to W3Techs, as of October 29, 2026, PHP is used by approximately 69.2% of websites whose server-side programming language can be identified by its survey.</p>



<p class="wp-block-paragraph">That distinction matters. The figure does not mean PHP powers exactly 69.2% of every website on the internet. It represents the proportion within W3Techs&#8217; measurable population of websites with a known server-side language.</p>



<p class="wp-block-paragraph">Nevertheless, it demonstrates PHP&#8217;s continuing significance. WordPress, Drupal, TYPO3, Laravel, Symfony, and numerous commercial and custom-built applications depend on the language.</p>



<p class="wp-block-paragraph">For businesses, PHP is not merely a programming language. It is part of their operational infrastructure. Its stability affects e-commerce transactions, publishing platforms, administrative systems, customer services, and enterprise integrations.</p>



<p class="wp-block-paragraph">That dependence makes the sustainability of PHP&#8217;s core development team an important issue for the broader technology industry.</p>



<h2 class="wp-block-heading">One Full-Time Employee Does Not Mean One PHP Developer</h2>



<p class="wp-block-paragraph">The most striking detail in the Reuters interview is that the Foundation employs only one person full-time.</p>



<p class="wp-block-paragraph">However, it would be misleading to conclude that PHP is maintained by just one developer.</p>



<p class="wp-block-paragraph">According to Barron, the Foundation also works with 14 contractors, mostly on a part-time basis. These contributors support activities including language maintenance, security, infrastructure, and ecosystem development.</p>



<p class="wp-block-paragraph">The wider PHP project also benefits from independent volunteers and contributors employed by companies throughout the ecosystem.</p>



<p class="wp-block-paragraph">Importantly, The PHP Foundation does not own PHP or control decisions about the language. PHP&#8217;s development and Request for Comments process remain community-governed.</p>



<p class="wp-block-paragraph">The Foundation&#8217;s principal role is to provide financial and organizational support so experienced contributors can dedicate time to work that would otherwise depend on availability, personal circumstances, and voluntary effort.</p>



<p class="wp-block-paragraph">Contractors are a legitimate and flexible way to fund open-source development. The central concern is not their employment classification, but whether enough experienced engineering capacity is available when difficult maintenance and security problems arise.</p>



<h2 class="wp-block-heading">What the Foundation&#8217;s Financial Reports Reveal</h2>



<p class="wp-block-paragraph">The PHP Foundation publishes financial information through its annual transparency reports and Open Collective.</p>



<p class="wp-block-paragraph">Its 2025 Impact and Transparency Report, released on May 27, 2026, provides useful context for Barron&#8217;s comments.</p>



<p class="wp-block-paragraph">During 2025, the Foundation received $730,534 in gross contributions from sponsors and individual donors. After approximately $85,343 in fiscal hosting and transaction fees, the amount received was $645,191.</p>



<p class="wp-block-paragraph">Total expenses reached $784,376, creating a difference of approximately $139,000 between net receipts and spending.</p>



<p class="wp-block-paragraph">The Foundation explained that this was a deliberate decision to maintain its technical investment while working to strengthen its funding base.</p>



<p class="wp-block-paragraph">The report also stated that the organization remained financially solvent with healthy reserves. Therefore, the financial figures should not be interpreted as evidence of immediate insolvency.</p>



<p class="wp-block-paragraph">Nevertheless, repeatedly spending more than recurring income is not a sustainable long-term operating model. Reserves can absorb temporary deficits, but they cannot indefinitely replace predictable funding.</p>



<p class="wp-block-paragraph">The same report recorded support from 536 organizations and individual contributors in 2025, fewer than in the preceding year.</p>



<p class="wp-block-paragraph">This is an important signal. A technology with an enormous worldwide user base still depends on a comparatively small community of organizations and individuals willing to finance its core development.</p>



<h2 class="wp-block-heading">The Foundation&#8217;s Contribution Is Already Significant</h2>



<p class="wp-block-paragraph">The limited budget should be considered alongside what the Foundation&#8217;s developers actually deliver.</p>



<p class="wp-block-paragraph">According to its 2025 report, Foundation-supported developers authored approximately 42% of commits to PHP&#8217;s core repository during that year.</p>



<p class="wp-block-paragraph">The team also produced roughly 32% of merged pull requests in php-src and reviewed 1,685 community pull requests.</p>



<p class="wp-block-paragraph">These figures indicate substantial involvement, although commit counts alone do not measure engineering complexity or individual productivity.</p>



<p class="wp-block-paragraph">Beyond PHP core, Foundation-supported work included the development of PIE, the modern PHP extension installer, modernization of the streams layer, Windows build infrastructure, documentation, performance improvements, and security maintenance.</p>



<p class="wp-block-paragraph">Some of these activities receive relatively little attention outside the core development community.</p>



<p class="wp-block-paragraph">Yet reliable Windows distributions, maintained extensions, timely bug fixes, and secure networking infrastructure are essential to developers who may never directly interact with the PHP Foundation.</p>



<p class="wp-block-paragraph">The difference between the Foundation&#8217;s visible public profile and its actual contribution is therefore considerable.</p>



<h2 class="wp-block-heading">The October 2026 Security Crisis</h2>



<p class="wp-block-paragraph">The funding discussion became particularly urgent following the discovery and coordinated disclosure of two critical vulnerabilities in PHP.</p>



<p class="wp-block-paragraph">On October 21, 2026, the PHP project released PHP 8.5.12, 8.4.27, 8.3.36, and 8.2.35 to address CVE-2026-109618 and CVE-2026-109619.</p>



<p class="wp-block-paragraph">Both vulnerabilities carried a CVSS v4.0 severity score of 9.2 and could permit unauthenticated remote code execution under certain conditions.</p>



<p class="wp-block-paragraph">The vulnerabilities involved fundamental runtime mechanisms, including memory management, error handling, and the lifetime of internal request data.</p>



<p class="wp-block-paragraph">One attack scenario could be triggered through Apache mod_php before application code had an opportunity to execute, making conventional application-level input validation insufficient as a defense.</p>



<p class="wp-block-paragraph">The security response involved PHP maintainers, external researchers, distributors, and several cybersecurity organizations.</p>



<p class="wp-block-paragraph">According to the Foundation and Reuters, researchers and organizations including Calif, OpenAI, and Wiz contributed findings that helped establish the vulnerabilities&#8217; impact and coordinate the response.</p>



<p class="wp-block-paragraph">Cloudflare reported large volumes of attempted exploitation. However, attempted exploitation should not be confused with successful compromise.</p>



<p class="wp-block-paragraph">In her October 23 interview, Barron said the Foundation had no evidence of successful exploitation before disclosure or of compromises affecting properly patched systems. That statement reflects the evidence available to the Foundation at the time, not a guarantee that no successful exploitation could have occurred elsewhere.</p>



<h2 class="wp-block-heading">A Difficult Admission About the Security Response</h2>



<p class="wp-block-paragraph">One of the most revealing developments came from the PHP Foundation itself.</p>



<p class="wp-block-paragraph">In a detailed October 21 statement, the organization acknowledged that the underlying memory-management problem associated with CVE-2026-109618 had first attracted attention during security work in 2024.</p>



<p class="wp-block-paragraph">At that stage, researchers had not established the concrete remote-code-execution vectors that would emerge later.</p>



<p class="wp-block-paragraph">The security team considered different solutions, but each involved difficult tradeoffs affecting compatibility, performance, denial-of-service risks, or third-party extensions.</p>



<p class="wp-block-paragraph">The Foundation explained that decision-making by consensus, combined with limited availability among developers deeply familiar with PHP&#8217;s internals, caused the work to stall repeatedly.</p>



<p class="wp-block-paragraph">In August 2026, further research demonstrated the vulnerability&#8217;s more serious consequences and accelerated the effort to develop a fix.</p>



<p class="wp-block-paragraph">The Foundation openly characterized the delay as a structural failure, involving both decision-making procedures and insufficient resources.</p>



<p class="wp-block-paragraph">This admission deserves attention because it illustrates why security maintenance cannot depend exclusively on the availability of individual experts.</p>



<p class="wp-block-paragraph">Complex fixes require sustained investigation, testing across supported platforms, coordination with extension maintainers, and agreement on the risks introduced by alternative solutions.</p>



<p class="wp-block-paragraph">Additional funding would not automatically eliminate technical disagreements, but it could allow more experienced engineers to work on these problems simultaneously and reduce the consequences of limited individual availability.</p>



<h2 class="wp-block-heading">Artificial Intelligence Is Increasing the Maintenance Burden</h2>



<p class="wp-block-paragraph">Another important dimension of the Reuters report concerns artificial intelligence.</p>



<p class="wp-block-paragraph">AI-assisted tools have improved the ability of researchers to discover potential vulnerabilities and inspect large codebases. The PHP security response has already benefited from such tools.</p>



<p class="wp-block-paragraph">However, the same technology is creating additional work for maintainers.</p>



<p class="wp-block-paragraph">Barron told Reuters that the volume of proposed code changes received by the PHP project had nearly doubled compared with the previous year, without a comparable increase in contributors.</p>



<p class="wp-block-paragraph">A greater number of submissions does not necessarily mean a corresponding increase in valuable contributions.</p>



<p class="wp-block-paragraph">Every proposed patch requires review for correctness, compatibility, security, maintainability, and alignment with the language&#8217;s design.</p>



<p class="wp-block-paragraph">The pressure is especially visible in security reporting. In an October 14 article, PHP security team member Alexandre Daubois reported that 15 CVEs had been published since July 1, while 106 reports had been closed because they were invalid, duplicates, or could not be reproduced.</p>



<p class="wp-block-paragraph">Even a report that ultimately proves invalid may require significant work to investigate and reproduce.</p>



<p class="wp-block-paragraph">AI can help classify reports, reproduce bugs, and assist with analysis. It cannot independently assume responsibility for the correctness of a security patch or the consequences of changing low-level runtime behavior.</p>



<p class="wp-block-paragraph">The emerging challenge is therefore not simply producing more code. It is ensuring that the capacity to review and maintain that code keeps pace with the increasing volume of contributions and security findings.</p>



<h2 class="wp-block-heading">Who Should Pay for PHP?</h2>



<p class="wp-block-paragraph">PHP&#8217;s funding model raises a broader question about commercial dependence on open-source infrastructure.</p>



<p class="wp-block-paragraph">Companies can build substantial businesses using PHP without paying a licensing fee to the language&#8217;s maintainers.</p>



<p class="wp-block-paragraph">This freedom is fundamental to open-source software. It has contributed to PHP&#8217;s adoption, flexibility, and longevity.</p>



<p class="wp-block-paragraph">However, freedom from licensing fees does not mean that software maintenance is free.</p>



<p class="wp-block-paragraph">Experienced engineers must investigate security vulnerabilities, review contributions, maintain compatibility, improve performance, prepare releases, and support essential development infrastructure.</p>



<p class="wp-block-paragraph">These activities create value across an ecosystem much larger than the organizations financing them.</p>



<p class="wp-block-paragraph">Several companies, including JetBrains, Automattic, GoDaddy, Sentry, and other ecosystem participants, have supported the PHP Foundation. Their participation demonstrates that commercial organizations can contribute financially while preserving PHP&#8217;s open-source development model.</p>



<p class="wp-block-paragraph">The challenge is to make such contributions a predictable part of the industry&#8217;s operating model rather than an exceptional act of goodwill.</p>



<h2 class="wp-block-heading">Funding Must Come with Transparency and Accountability</h2>



<p class="wp-block-paragraph">Increasing sponsorship is important, but financial support alone is not sufficient.</p>



<p class="wp-block-paragraph">Organizations contributing substantial resources reasonably need to understand how that money is used, which outcomes it supports, and how progress can be evaluated.</p>



<p class="wp-block-paragraph">The PHP Foundation has already taken steps in this direction through published financial records, annual impact reports, quarterly updates, and its 2026 strategy.</p>



<p class="wp-block-paragraph">That strategy identifies fundraising as a major operational priority, alongside improvements to communication, contributor responsiveness, and the security ecosystem.</p>



<p class="wp-block-paragraph">Independent governance also remains important. Greater corporate funding should strengthen the technical community without allowing any individual sponsor to determine the language&#8217;s future for its own commercial benefit.</p>



<p class="wp-block-paragraph">The Foundation&#8217;s existing separation from PHP&#8217;s community-driven RFC process provides a useful starting point for maintaining that distinction.</p>



<h2 class="wp-block-heading">What a More Sustainable Model Could Look Like</h2>



<p class="wp-block-paragraph">A sustainable approach to PHP maintenance would benefit from several complementary measures rather than relying on a single source of funding.</p>



<ul class="wp-block-list">
<li><strong>Predictable corporate sponsorship:</strong> Organizations whose businesses depend on PHP could commit recurring annual funding instead of relying primarily on occasional donations.</li>



<li><strong>Dedicated security capacity:</strong> More funded engineering time could support vulnerability triage, audits, hardening, and coordinated disclosure.</li>



<li><strong>Knowledge transfer:</strong> Investment in contributor onboarding and internal documentation could reduce dependence on a small number of long-serving specialists.</li>



<li><strong>Independent financial reporting:</strong> Continued publication of spending, reserves, staffing, and technical outcomes would help sponsors evaluate the impact of their contributions.</li>



<li><strong>Diversified funding:</strong> A broader mix of corporate sponsors, public grants, and individual donations could reduce dependence on a limited group of organizations.</li>
</ul>



<p class="wp-block-paragraph">These are potential approaches, not guarantees. Increasing engineering capacity also requires recruitment, mentoring, governance, and time for new contributors to develop the deep knowledge required to maintain PHP&#8217;s internals.</p>





<h2 class="wp-block-heading">A Question the Industry Can No Longer Ignore</h2>



<p class="wp-block-paragraph">The PHP Foundation is not facing an immediate collapse according to its latest published annual financial report. It has reserves, dedicated contributors, established sponsors, and a strategy intended to improve its financial position.</p>



<p class="wp-block-paragraph">Yet those strengths should not obscure the underlying imbalance.</p>



<p class="wp-block-paragraph">The language serves a large part of the web, while much of its maintenance depends on a relatively small group of funded developers and volunteers.</p>



<p class="wp-block-paragraph">The October security incident illustrated both the expertise of that community and the structural challenges it faces when responding to complex vulnerabilities.</p>



<p class="wp-block-paragraph">The rise of AI-assisted code generation and security research will likely intensify the need for experienced maintainers capable of evaluating an increasing volume of changes and reports.</p>



<p class="wp-block-paragraph">For companies depending on PHP, the issue is not whether they are legally required to contribute. Open-source licenses generally do not impose such an obligation.</p>



<p class="wp-block-paragraph">The more relevant question is whether depending on critical infrastructure without contributing to its long-term maintenance is a sound business and engineering decision.</p>





<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">Reuters&#8217; October 23 report brings renewed attention to a structural problem that extends across the open-source ecosystem: software can become commercially indispensable without receiving financial support proportional to its importance.</p>



<p class="wp-block-paragraph">The PHP Foundation&#8217;s financial disclosures demonstrate that a comparatively modest budget supports work with significant consequences for developers, businesses, and public services worldwide.</p>



<p class="wp-block-paragraph">Its developers have delivered substantial improvements, coordinated complex security responses, and helped maintain a language that continues to evolve after three decades.</p>



<p class="wp-block-paragraph">But long-term resilience requires more than technical dedication. It requires sustainable funding, broader participation, effective governance, and sufficient engineering capacity to respond to increasingly complex security challenges.</p>



<p class="wp-block-paragraph"><strong>The future of PHP is not simply a question of what features the language will introduce next. It is also a question of whether the industry that depends on PHP is prepared to invest in the people responsible for keeping it reliable and secure.</strong></p>



<h2 class="wp-block-heading">Sources and Further Reading</h2>



<ul class="wp-block-list">
<li><a href="https://www.reuters.com/technology/php-foundation-under-funded-with-one-full-time-staff-member-director-says-2026-10-23/">Reuters &#8211; PHP Foundation Under-Funded, October 23, 2026</a></li>



<li><a href="https://thephp.foundation/blog/2026/05/27/impact-and-transparency-report-2025/">PHP Foundation &#8211; Impact and Transparency Report 2025</a></li>



<li><a href="https://thephp.foundation/blog/2026/10/21/todays-php-security-release-and-how-were-strengthening-php-security/">PHP Foundation &#8211; Security Response, October 21, 2026</a></li>



<li><a href="https://thephp.foundation/blog/2026/10/14/how-the-php-security-team-handles-your-reports/">PHP Security Team &#8211; Handling Security Reports</a></li>
</ul>




<p class="wp-block-paragraph"></p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://phpmagazine.net/2026/10/php-foundation-underfunded-security-sustainability-2026.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://phpmagazine.net/2026/10/php-foundation-underfunded-security-sustainability-2026.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>PHP Magazine Network</name>
							<uri>https://phpmagazine.net</uri>
						</author>

		<title type="html"><![CDATA[GitHub Dependabot Adds Reachability Analysis: A Better Way to Prioritize Vulnerable Dependencies]]></title>
		<link rel="alternate" type="text/html" href="https://phpmagazine.net/2026/10/github-dependabot-reachability-analysis-vulnerabilities.html" />

		<id>https://phpmagazine.net/?p=34741</id>
		<updated>2026-10-29T11:40:49Z</updated>
		<published>2026-10-29T13:20:00Z</published>
		<category scheme="https://phpmagazine.net" term="Cloud and DevOps" /><category scheme="https://phpmagazine.net" term="CodeQL" /><category scheme="https://phpmagazine.net" term="Dependabot" /><category scheme="https://phpmagazine.net" term="Dependency Security" /><category scheme="https://phpmagazine.net" term="devops" /><category scheme="https://phpmagazine.net" term="github" /><category scheme="https://phpmagazine.net" term="javascript" /><category scheme="https://phpmagazine.net" term="TypeScript" /><category scheme="https://phpmagazine.net" term="Vulnerability Management" />
		<summary type="html"><![CDATA[]]></summary>

					<content type="html" xml:base="https://phpmagazine.net/2026/10/github-dependabot-reachability-analysis-vulnerabilities.html"><![CDATA[

<p class="wp-block-paragraph">Dependency alerts are now a routine part of software development. A typical JavaScript application may depend on hundreds of packages, many of which bring additional transitive dependencies into the project.</p>



<p class="wp-block-paragraph">When vulnerabilities are reported, developers are expected to evaluate affected packages, determine their significance, and apply updates without introducing regressions.</p>



<p class="wp-block-paragraph">The difficulty is that traditional dependency alerts generally identify vulnerable package versions without establishing whether the application actually calls the affected code.</p>



<p class="wp-block-paragraph"><strong>On October 28, 2026, GitHub introduced reachability analysis for Dependabot alerts in public preview.</strong> The feature adds a new dimension to vulnerability prioritization by examining whether an application&#8217;s code can reach a known vulnerable function.</p>



<p class="wp-block-paragraph">For development and security teams dealing with large dependency trees, this information could make vulnerability triage more focused. But reachability should not be confused with proof of exploitability.</p>



<h2 class="wp-block-heading">The Limitations of Traditional Dependency Alerts</h2>



<p class="wp-block-paragraph">Consider an application that includes a library containing a vulnerable function. A dependency scanner detects that the installed package version is affected and creates an alert.</p>



<p class="wp-block-paragraph">At that point, several questions remain unanswered. Does the application import the vulnerable functionality? Is it reachable from production code? Does an attacker control the input required to trigger the flaw?</p>



<p class="wp-block-paragraph">Two applications using the same vulnerable package may have very different exposure levels. One might execute the affected function during every request, while another might never invoke it.</p>



<p class="wp-block-paragraph">Severity ratings and vulnerability advisories remain important, but they cannot fully describe how a particular application uses a dependency.</p>



<h2 class="wp-block-heading">How Reachability Analysis Works</h2>



<p class="wp-block-paragraph">GitHub&#8217;s new feature combines Dependabot advisory information with static code analysis.</p>



<p class="wp-block-paragraph">For supported advisories, GitHub maintains curated information identifying the vulnerable functions within affected packages. CodeQL then constructs a call graph covering the application&#8217;s code and its dependencies.</p>



<p class="wp-block-paragraph">The analysis searches for paths that connect application code to those vulnerable functions.</p>



<p class="wp-block-paragraph">When a path is found, the corresponding Dependabot alert can display evidence explaining how the vulnerable code is reached.</p>



<p class="wp-block-paragraph">This goes beyond simply knowing that a package exists in <code class="" data-line="">package-lock.json</code>, <code class="" data-line="">pnpm-lock.yaml</code>, or <code class="" data-line="">yarn.lock</code>.</p>



<h2 class="wp-block-heading">Four Possible Reachability Results</h2>



<p class="wp-block-paragraph">GitHub provides four verdicts for analyzed alerts.</p>



<ul class="wp-block-list">
<li><strong>Reachable:</strong> At least one call path was found between application code and the vulnerable function.</li>



<li><strong>Potentially reachable:</strong> The analysis cannot rule out a call to the vulnerable function. These alerts should receive attention comparable to reachable findings.</li>



<li><strong>Unreachable:</strong> The analysis completed without finding a call path. The alert may receive a lower priority, but should not be automatically dismissed.</li>



<li><strong>Reachability unavailable:</strong> The analysis could not produce a result, perhaps because the repository is unsupported or the scan failed.</li>
</ul>



<p class="wp-block-paragraph">These verdicts supplement existing security information. They do not close alerts, change advisory severity, or establish whether an attacker can successfully exploit a vulnerability.</p>



<h2 class="wp-block-heading">An Example from a JavaScript Application</h2>



<p class="wp-block-paragraph">Imagine an application that includes a hypothetical dependency named <code class="" data-line="">example-parser</code>. A security advisory identifies one of its parsing functions as vulnerable when processing specially crafted input.</p>



<p class="wp-block-paragraph">Application code might call the library through a helper module:</p>



<pre class="wp-block-code"><code class="" data-line="">import { parseDocument } from &quot;example-parser&quot;;

export function processUpload(content) {
    return parseDocument(content);
}</code></pre>



<p class="wp-block-paragraph">If <code class="" data-line="">parseDocument()</code> were identified as vulnerable, reachability analysis could potentially identify the call path from <code class="" data-line="">processUpload()</code> to the affected function.</p>



<p class="wp-block-paragraph">This example is illustrative. The package name and vulnerability are hypothetical, not a real security advisory.</p>



<p class="wp-block-paragraph">Even with a reachable result, further investigation would be required to establish whether users can supply the relevant input and whether the application&#8217;s execution environment satisfies the conditions described in the advisory.</p>



<h2 class="wp-block-heading">Enabling Reachability Analysis</h2>



<p class="wp-block-paragraph">During the public preview, reachability analysis is available for GitHub Enterprise Cloud repositories, including organizations using Enterprise Cloud with data residency.</p>



<p class="wp-block-paragraph">The current implementation supports JavaScript and TypeScript projects using npm, Yarn, or pnpm lockfiles.</p>



<p class="wp-block-paragraph">Dependabot alerts must already be enabled. Administrators can activate reachability analysis through repository security settings or organizational security configurations.</p>



<p class="wp-block-paragraph">GitHub runs the analysis through managed GitHub Actions infrastructure. Repository maintainers do not need to install a local scanner or maintain a separate analysis workflow.</p>



<p class="wp-block-paragraph">The feature is free during the preview and does not consume billed GitHub Actions minutes. GitHub states that a separate Code Security license is not required.</p>



<h2 class="wp-block-heading">Understanding the Operational Limitations</h2>



<p class="wp-block-paragraph">The new analysis is not yet available for every programming language or package ecosystem. PHP Composer dependencies, for example, are outside the current JavaScript and TypeScript scope.</p>



<p class="wp-block-paragraph">Repositories using self-hosted runners are not supported by the analysis during the preview, which relies on GitHub-hosted infrastructure.</p>



<p class="wp-block-paragraph">Large monorepos and projects with complicated dependency layouts may encounter limitations, including scans that exceed the current three-hour execution limit.</p>



<p class="wp-block-paragraph">Results are also not instantaneous. After the initial scan, GitHub refreshes reachability information approximately every 24 hours while open alerts remain. Pushing new code does not immediately trigger a new assessment.</p>



<p class="wp-block-paragraph">This delay matters when developers change a dependency call path and expect the alert&#8217;s verdict to reflect the modification.</p>



<h2 class="wp-block-heading">Reachability Is Not Exploitability</h2>



<p class="wp-block-paragraph">One of the most important distinctions is between a function being reachable and a vulnerability being exploitable.</p>



<p class="wp-block-paragraph">A vulnerable function may be called only with trusted constants, sanitized values, or under conditions inaccessible to an attacker.</p>



<p class="wp-block-paragraph">Conversely, static analysis can miss dynamically constructed calls or fail to resolve complex execution paths.</p>



<p class="wp-block-paragraph">An unreachable verdict should therefore never become an automatic justification for permanently ignoring a security update.</p>



<p class="wp-block-paragraph">Teams should combine reachability with advisory severity, exploit prediction scores, production exposure, available patches, and knowledge of how the application actually operates.</p>



<h2 class="wp-block-heading">What This Changes for Security Teams</h2>



<p class="wp-block-paragraph">For teams with hundreds of open alerts, the main benefit is better prioritization. Instead of treating every affected package as equally urgent, they gain evidence about how their application interacts with vulnerable code.</p>



<p class="wp-block-paragraph">That evidence can also improve communication between security specialists and developers. A finding accompanied by a concrete call path is easier to investigate than a generic alert containing only a package name and version range.</p>



<p class="wp-block-paragraph">Reachability results are available through the Dependabot alerts REST API, allowing organizations to incorporate them into existing vulnerability-management dashboards and reporting systems.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">GitHub&#8217;s reachability analysis introduces a useful improvement to dependency security by connecting vulnerability information with actual application code.</p>



<p class="wp-block-paragraph">Its current scope is limited, and the feature remains in public preview. Nevertheless, the underlying approach addresses a practical problem: dependency vulnerability management needs context, not just longer lists of alerts.</p>



<p class="wp-block-paragraph">For eligible teams, reachability analysis offers another signal for deciding which problems to investigate first, while preserving the need for careful technical judgment.</p>



<h2 class="wp-block-heading">Official References</h2>



<ul class="wp-block-list">
<li><a href="https://github.blog/changelog/2026-10-28-prioritize-dependabot-alerts-with-reachability-analysis/">GitHub Changelog — October 28, 2026</a></li>



<li><a href="https://docs.github.com/en/code-security/concepts/supply-chain-security/about-reachability-analysis-for-dependabot-alerts">GitHub Docs — About Reachability Analysis</a></li>



<li><a href="https://docs.github.com/en/code-security">GitHub Docs — Security and Code Quality</a></li>
</ul>

]]></content>
		
					<link rel="replies" type="text/html" href="https://phpmagazine.net/2026/10/github-dependabot-reachability-analysis-vulnerabilities.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://phpmagazine.net/2026/10/github-dependabot-reachability-analysis-vulnerabilities.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Hatem Ben Yacoub</name>
							<uri>http://hbyconsusltancy.com</uri>
						</author>

		<title type="html"><![CDATA[A Developer Portfolio Should Explain Decisions, Not Just Display Projects]]></title>
		<link rel="alternate" type="text/html" href="https://phpmagazine.net/2026/10/developer-portfolio-explain-decisions.html" />

		<id>https://phpmagazine.net/?p=34733</id>
		<updated>2026-10-29T11:06:31Z</updated>
		<published>2026-10-29T13:02:00Z</published>
		<category scheme="https://phpmagazine.net" term="Business &amp; Career" /><category scheme="https://phpmagazine.net" term="career growth" /><category scheme="https://phpmagazine.net" term="developer careers" /><category scheme="https://phpmagazine.net" term="hiring" /><category scheme="https://phpmagazine.net" term="portfolio" /><category scheme="https://phpmagazine.net" term="technical communication" /><category scheme="https://phpmagazine.net" term="Web development" />
		<summary type="html"><![CDATA[]]></summary>

					<content type="html" xml:base="https://phpmagazine.net/2026/10/developer-portfolio-explain-decisions.html"><![CDATA[

<p class="wp-block-paragraph">A portfolio full of polished screenshots can show that a developer has worked on attractive projects. It does not necessarily show how that developer thinks.</p>



<p class="wp-block-paragraph">Employers and clients need evidence that you can understand a problem, make decisions under constraints, collaborate with others, and deliver something useful. A stronger portfolio makes that reasoning visible. It turns a list of projects into a small collection of case studies.</p>



<h2 class="wp-block-heading">Begin with the problem</h2>



<p class="wp-block-paragraph">Many project descriptions start with a technology list: PHP, JavaScript, PostgreSQL, Docker, and a framework. Those details matter, but they do not tell a reader why the project existed.</p>



<p class="wp-block-paragraph">Start by describing the user or business problem in plain language. Was a team manually processing orders? Were customers unable to find information on mobile devices? Did an internal application have a slow release process? A reader should understand the need before seeing the solution.</p>



<p class="wp-block-paragraph">Keep the context specific without revealing confidential information. “A regional retailer needed to manage stock across two locations” is often more useful than “an innovative platform for a leading client.” If you cannot disclose the client’s identity, say so and focus on the work you are permitted to discuss.</p>



<h2 class="wp-block-heading">Explain your role accurately</h2>



<p class="wp-block-paragraph">Web applications are usually team efforts. A case study should make it easy to distinguish the overall project from your contribution. Did you lead discovery, implement the API, improve database queries, build the interface, or coordinate releases?</p>



<p class="wp-block-paragraph">Specific ownership builds credibility. “I implemented the payment integration and added failure handling” says more than “I helped build an e-commerce platform.” If the work was collaborative, name the collaboration: explaining how you worked with a designer, product owner, or another developer is evidence of professional maturity.</p>



<h2 class="wp-block-heading">Show the decision and its trade-off</h2>



<p class="wp-block-paragraph">A useful case study includes at least one decision that was not automatic. Perhaps you chose a modular monolith because the team needed a simpler deployment process. Perhaps you used an existing open-source package rather than building a component from scratch. Perhaps you postponed an integration to deliver the core workflow sooner.</p>



<p class="wp-block-paragraph">Explain the alternatives you considered and the reason for the choice. Avoid claiming that one technology was universally superior. The interesting point is how the decision fit the constraints: available time, team skills, operating costs, data requirements, or the client’s appetite for ongoing maintenance.</p>



<p class="wp-block-paragraph">If you would make a different choice today, say why. An honest reflection on a limitation can be more persuasive than a case study in which every decision appears perfect.</p>



<h2 class="wp-block-heading">Present outcomes you can support</h2>



<p class="wp-block-paragraph">Outcomes do not always need a dramatic percentage. If you have permission to share reliable measurements, describe what was measured and the relevant period. For example, explain that a report took 20 minutes to prepare manually before the project and roughly five minutes afterward, if that comparison is documented.</p>



<p class="wp-block-paragraph">If you do not have reliable numbers, use a concrete qualitative outcome: the operations team could update inventory without developer assistance, a new deployment checklist reduced manual steps, or the application gained a documented recovery process. Do not invent metrics or imply that every improvement was caused solely by your work.</p>



<h2 class="wp-block-heading">Give different readers a useful path</h2>



<p class="wp-block-paragraph">A hiring manager may want to understand your role quickly. A technical lead may want architecture details. A prospective client may care most about the problem and business result. Structure each case study so all three can find what they need.</p>



<ul class="wp-block-list">
<li><strong>Overview:</strong> the problem, your role, and the result in a few sentences.</li>



<li><strong>Context:</strong> users, constraints, and the project’s purpose.</li>



<li><strong>Decisions:</strong> the approach, alternatives, and relevant technical choices.</li>



<li><strong>Outcome:</strong> what changed and what evidence supports it.</li>



<li><strong>Reflection:</strong> what you learned or would improve next.</li>
</ul>



<p class="wp-block-paragraph">Add screenshots, a short demonstration, or a repository link when they help explain the work and you have the right to share them. A private commercial project can still become a useful case study without exposing source code or customer data.</p>



<h2 class="wp-block-heading">Three thoughtful examples can be enough</h2>



<p class="wp-block-paragraph">You do not need to document every project you have touched. Choose examples that demonstrate different strengths: perhaps one shows application development, another shows troubleshooting or performance work, and a third shows collaboration or product thinking.</p>



<p class="wp-block-paragraph">For developers early in their careers, a personal project can be valuable if it solves a clear problem and includes the same honest account of decisions and limitations. For experienced developers, a small number of carefully chosen case studies can communicate more than a long inventory of technology logos.</p>



<p class="wp-block-paragraph">A portfolio is an invitation to a professional conversation. Give the reader enough context to ask a good question, and you have already made that conversation more productive.</p>

]]></content>
		
					<link rel="replies" type="text/html" href="https://phpmagazine.net/2026/10/developer-portfolio-explain-decisions.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://phpmagazine.net/2026/10/developer-portfolio-explain-decisions.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Hatem Ben Yacoub</name>
							<uri>http://hbyconsusltancy.com</uri>
						</author>

		<title type="html"><![CDATA[JPEG XL Arrives in Chrome: What Web Developers Should Know Before Adopting It]]></title>
		<link rel="alternate" type="text/html" href="https://phpmagazine.net/2026/10/jpeg-xl-chrome-web-image-optimization.html" />

		<id>https://phpmagazine.net/?p=34746</id>
		<updated>2026-10-29T11:45:42Z</updated>
		<published>2026-10-29T11:45:18Z</published>
		<category scheme="https://phpmagazine.net" term="Front-End Development" /><category scheme="https://phpmagazine.net" term="AVIF" /><category scheme="https://phpmagazine.net" term="Browser Compatibility" /><category scheme="https://phpmagazine.net" term="chrome" /><category scheme="https://phpmagazine.net" term="Image Optimization" /><category scheme="https://phpmagazine.net" term="JPEG XL" /><category scheme="https://phpmagazine.net" term="Web Performance" />
		<summary type="html"><![CDATA[]]></summary>

					<content type="html" xml:base="https://phpmagazine.net/2026/10/jpeg-xl-chrome-web-image-optimization.html"><![CDATA[

<p class="wp-block-paragraph">Image optimization remains one of the most practical ways to improve website performance. Images often represent a significant portion of the data transferred during a page load, particularly on content-heavy websites, online stores, and media platforms.</p>



<p class="wp-block-paragraph">For years, developers have relied on JPEG, PNG, WebP, and more recently AVIF to balance image quality, file size, and browser compatibility.</p>



<p class="wp-block-paragraph"><strong>With JPEG XL decoding support introduced in Chrome 155, another modern image format becomes a realistic option for web development.</strong> Google announced the integration on October 6, 2026, highlighting improved compression, lossless capabilities, high dynamic range support, and a new Rust-based decoder.</p>



<p class="wp-block-paragraph">However, the arrival of another image format does not mean developers should immediately replace their existing image pipelines. The practical question is where JPEG XL provides measurable benefits and how it can be introduced without compromising compatibility.</p>



<h2 class="wp-block-heading">What Is JPEG XL?</h2>



<p class="wp-block-paragraph">JPEG XL is an image format standardized as ISO/IEC 18181. It was designed to address limitations of older image formats while supporting both lossy and lossless compression.</p>



<p class="wp-block-paragraph">Unlike traditional JPEG, JPEG XL supports transparency, animation, high bit depths, wide color gamuts, and high dynamic range images.</p>



<p class="wp-block-paragraph">One particularly interesting capability is lossless JPEG transcoding. Existing JPEG images can be converted into a JPEG XL representation while preserving the information needed to reconstruct the original JPEG file exactly.</p>



<p class="wp-block-paragraph">For organizations maintaining large photographic archives, this can provide a migration path that preserves existing image assets while potentially reducing storage requirements.</p>



<p class="wp-block-paragraph">It is important to distinguish this capability from ordinary lossy re-encoding. Lossless JPEG transcoding preserves the original JPEG bitstream, while re-encoding an image with different quality settings may alter its visual content.</p>



<h2 class="wp-block-heading">Why Chrome Support Matters</h2>



<p class="wp-block-paragraph">Browser support is one of the main factors determining whether a new image format becomes practical for general websites.</p>



<p class="wp-block-paragraph">Google&#8217;s addition of JPEG XL decoding in Chrome 155 substantially broadens its potential audience. The Chrome team reports that JPEG XL can offer compression improvements of roughly 30% to 50% compared with JPEG in relevant scenarios.</p>



<p class="wp-block-paragraph">That figure should not be treated as a universal performance guarantee. Compression efficiency depends on the image content, encoding settings, quality targets, and comparison methodology.</p>



<p class="wp-block-paragraph">Google also recommends evaluating JPEG XL alongside AVIF rather than assuming one format will consistently outperform the other.</p>



<p class="wp-block-paragraph">JPEG XL may be particularly interesting for high-fidelity photographic content, lossless compression, and use cases benefiting from progressive decoding.</p>



<h2 class="wp-block-heading">Using JPEG XL Without Breaking Older Browsers</h2>



<p class="wp-block-paragraph">The simplest adoption strategy is progressive enhancement. Instead of replacing an existing JPEG or AVIF image, developers can provide multiple formats and allow the browser to select a supported version.</p>



<p class="wp-block-paragraph">The HTML <code class="" data-line="">&lt;picture&gt;</code> element provides this capability without JavaScript.</p>



<pre class="wp-block-code"><code class="" data-line="">&lt;picture&gt;
    &lt;source
        srcset=&quot;/images/article.jxl&quot;
        type=&quot;image/jxl&quot;
    &gt;

    &lt;source
        srcset=&quot;/images/article.avif&quot;
        type=&quot;image/avif&quot;
    &gt;

    &lt;img
        src=&quot;/images/article.jpg&quot;
        alt=&quot;A detailed architectural photograph&quot;
        width=&quot;1200&quot;
        height=&quot;800&quot;
        decoding=&quot;async&quot;
    &gt;
&lt;/picture&gt;</code></pre>



<p class="wp-block-paragraph">In this example, a browser supporting JPEG XL can select the first source. Other browsers may select AVIF or fall back to the JPEG image.</p>



<p class="wp-block-paragraph">The <code class="" data-line="">type</code> attribute helps the browser determine whether it supports the format before requesting the corresponding image.</p>



<p class="wp-block-paragraph">The fallback image also ensures that browsers without support for the newer formats can still display the content.</p>



<p class="wp-block-paragraph">Developers should retain appropriate <code class="" data-line="">width</code> and <code class="" data-line="">height</code> attributes to reserve layout space and reduce unexpected content movement during loading.</p>



<h2 class="wp-block-heading">JPEG XL Versus AVIF: Which Should You Choose?</h2>



<p class="wp-block-paragraph">Both JPEG XL and AVIF support features that traditional JPEG lacks. These include high-quality compression, transparency, and support for modern image characteristics.</p>



<p class="wp-block-paragraph">However, their underlying technologies and practical tradeoffs differ.</p>



<p class="wp-block-paragraph">AVIF is based on the AV1 video codec. It is already widely used for modern web images and can provide excellent compression, particularly at lower bitrates.</p>



<p class="wp-block-paragraph">JPEG XL was designed specifically for image coding and includes features such as fine-grained progressive decoding and lossless JPEG transcoding.</p>



<p class="wp-block-paragraph">For a photography website maintaining a large collection of existing JPEG images, JPEG XL&#8217;s transcoding capabilities may be attractive.</p>



<p class="wp-block-paragraph">For an application already generating AVIF images with satisfactory quality and file sizes, the additional complexity of another format may not immediately justify the change.</p>



<p class="wp-block-paragraph">The appropriate choice depends on real content and measured results rather than theoretical compression ratios alone.</p>



<h2 class="wp-block-heading">A New Decoder Built with Rust</h2>



<p class="wp-block-paragraph">Another notable aspect of Chrome&#8217;s implementation is the choice of decoder.</p>



<p class="wp-block-paragraph">Instead of integrating the existing C++ reference implementation directly, the Chrome team adopted <code class="" data-line="">jxl-rs</code>, a JPEG XL decoder implemented in Rust.</p>



<p class="wp-block-paragraph">Image decoders process complex binary files that may originate from untrusted sources. Vulnerabilities in this area can expose browsers to memory corruption and other security problems.</p>



<p class="wp-block-paragraph">Rust provides memory-safety guarantees that help reduce entire classes of vulnerabilities. The Chrome team also invested in SIMD optimizations to improve decoding performance across different hardware platforms.</p>



<p class="wp-block-paragraph">This does not mean every JPEG XL decoder is automatically secure, or that Rust eliminates all possible implementation bugs.</p>



<p class="wp-block-paragraph">It does, however, illustrate how browser vendors increasingly consider memory safety a fundamental requirement when introducing code that processes untrusted data.</p>



<h2 class="wp-block-heading">What About Content Management Systems?</h2>



<p class="wp-block-paragraph">For websites using WordPress or another content management system, browser support is only one part of the implementation.</p>



<p class="wp-block-paragraph">The server must also be capable of accepting or generating JPEG XL files, storing them, and serving them with the correct MIME type: <code class="" data-line="">image/jxl</code>.</p>



<p class="wp-block-paragraph">Image libraries, thumbnail generators, content delivery networks, and media optimization plugins may require updates before JPEG XL can be integrated into an existing workflow.</p>



<p class="wp-block-paragraph">Developers should verify the capabilities of their actual hosting environment rather than assuming that new browser support automatically means the entire publishing stack supports the format.</p>



<p class="wp-block-paragraph">For smaller websites, generating JPEG XL alternatives only for selected high-resolution images may be more practical than converting the entire media library.</p>



<h2 class="wp-block-heading">Measuring the Real Performance Benefits</h2>



<p class="wp-block-paragraph">Before introducing JPEG XL widely, developers should compare representative images across JPEG, AVIF, WebP, and JPEG XL at equivalent perceptual quality.</p>



<p class="wp-block-paragraph">Useful measurements include final file size, encoding time, decoding behavior, visual quality, and actual page-loading performance.</p>



<p class="wp-block-paragraph">For large websites, a format that produces slightly smaller files but significantly complicates image generation or caching may not provide an attractive operational tradeoff.</p>



<p class="wp-block-paragraph">Similarly, saving bandwidth does not automatically guarantee an improvement in Largest Contentful Paint. Network conditions, image dimensions, preload behavior, decoding time, and rendering priorities all influence the final result.</p>



<p class="wp-block-paragraph">A controlled experiment using real website images and representative devices provides considerably more useful information than relying on compression benchmarks alone.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">JPEG XL&#8217;s arrival in Chrome represents a meaningful development for modern web image delivery.</p>



<p class="wp-block-paragraph">It expands the options available to developers, particularly for high-quality photographic content, lossless workflows, and applications that can benefit from progressive image decoding.</p>



<p class="wp-block-paragraph">Nevertheless, adopting a new image format requires more than browser support. Compatibility, content-generation tools, hosting infrastructure, and actual performance gains all need to be evaluated.</p>



<p class="wp-block-paragraph">For most web applications, the sensible approach is to experiment with JPEG XL as an additional format while retaining reliable alternatives. The format offers interesting capabilities, but the decision to adopt it should ultimately be based on measurable benefits.</p>



<h2 class="wp-block-heading">Official References</h2>



<ul class="wp-block-list">
<li><a href="https://developer.chrome.com/blog/jpeg-xl-in-chrome">Chrome for Developers — Shipping JPEG XL in Chrome, October 6, 2026</a></li>



<li><a href="https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Formats/Image_types">MDN — Image File Type and Format Guide</a></li>



<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/picture">MDN — HTML Picture Element</a></li>
</ul>

]]></content>
		
					<link rel="replies" type="text/html" href="https://phpmagazine.net/2026/10/jpeg-xl-chrome-web-image-optimization.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://phpmagazine.net/2026/10/jpeg-xl-chrome-web-image-optimization.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>PHP Magazine Network</name>
							<uri>https://phpmagazine.net</uri>
						</author>

		<title type="html"><![CDATA[PHP 8.4 Property Hooks: Building Validated Data Objects Without Boilerplate]]></title>
		<link rel="alternate" type="text/html" href="https://phpmagazine.net/2026/10/php-84-property-hooks-validated-data-objects.html" />

		<id>https://phpmagazine.net/?p=34737</id>
		<updated>2026-10-29T11:20:19Z</updated>
		<published>2026-10-29T11:20:10Z</published>
		<category scheme="https://phpmagazine.net" term="Advanced Topics" /><category scheme="https://phpmagazine.net" term="Best Practices" /><category scheme="https://phpmagazine.net" term="Asymmetric Visibility" /><category scheme="https://phpmagazine.net" term="Best practices" /><category scheme="https://phpmagazine.net" term="Data Validation" /><category scheme="https://phpmagazine.net" term="PHP 8.4" /><category scheme="https://phpmagazine.net" term="PHP OOP" /><category scheme="https://phpmagazine.net" term="Property Hooks" />
		<summary type="html"><![CDATA[]]></summary>

					<content type="html" xml:base="https://phpmagazine.net/2026/10/php-84-property-hooks-validated-data-objects.html"><![CDATA[

<p class="wp-block-paragraph">Data validation is a familiar problem in PHP applications. Whether information comes from an HTTP request, an imported CSV file, or an external API, developers need to ensure that values are properly normalized and validated before they enter the application&#8217;s domain model.</p>



<p class="wp-block-paragraph">Traditionally, this involves private properties, constructors, getters, setters, and sometimes additional validation classes. These approaches remain useful, but they can introduce considerable repetitive code for relatively simple objects.</p>



<p class="wp-block-paragraph"><strong>PHP 8.4 introduced property hooks and asymmetric property visibility, two language features that offer another way to organize data objects.</strong> Together, they allow developers to define how a property accepts values while controlling who can modify it.</p>



<p class="wp-block-paragraph">Let&#8217;s examine how these features work through a practical contact-profile example, including situations where they should not replace conventional methods or immutable objects.</p>



<h2 class="wp-block-heading">The Problem with Traditional Getters and Setters</h2>



<p class="wp-block-paragraph">Consider a class representing a contact profile. Its name must not be empty, its email address must be valid, and its age must fall within an accepted range.</p>



<p class="wp-block-paragraph">A conventional implementation might declare private properties and expose a separate setter for each field. The setters then normalize or validate the incoming values before storing them.</p>



<p class="wp-block-paragraph">Nothing is fundamentally wrong with this design. It protects the object&#8217;s internal state and provides an explicit interface. However, for a class with many fields, maintaining matching getter and setter methods can become tedious.</p>



<p class="wp-block-paragraph">Property hooks address part of this problem by letting the property declaration itself define custom read and write behavior.</p>



<h2 class="wp-block-heading">Understanding Property Hooks</h2>



<p class="wp-block-paragraph">PHP 8.4 supports two property hooks: <code class="" data-line="">get</code> and <code class="" data-line="">set</code>. A getter hook customizes how the value is read, while a setter hook intercepts assignments.</p>



<p class="wp-block-paragraph">For example, the following property automatically trims whitespace before storing a contact name:</p>



<pre class="wp-block-code"><code class="" data-line="">&lt;?php

class Contact
{
    public string $name {
        set(string $value) {
            $this-&gt;name = trim($value);
        }
    }
}

$contact = new Contact();
$contact-&gt;name = &#039;  Ada Lovelace  &#039;;

echo $contact-&gt;name;
// Ada Lovelace</code></pre>



<p class="wp-block-paragraph">The property remains backed by an actual stored value. Referencing <code class="" data-line="">$this-&gt;name</code> inside its own setter does not recursively invoke the same hook.</p>



<p class="wp-block-paragraph">This makes it possible to implement normalization and validation without introducing a separate setter method.</p>



<h2 class="wp-block-heading">Building a Validated Contact Profile</h2>



<p class="wp-block-paragraph">Let&#8217;s build a more complete example. Our profile contains a name, an email address, and an age. Once constructed, these fields should remain readable from outside the class but should not be directly writable.</p>



<p class="wp-block-paragraph">We can combine property hooks with PHP 8.4&#8217;s asymmetric visibility syntax, <code class="" data-line="">public private(set)</code>:</p>



<pre class="wp-block-code"><code class="" data-line="">&lt;?php

declare(strict_types=1);

final class ContactProfile
{
    public private(set) string $name {
        set(string $value) {
            $value = trim($value);

            if ($value === &#039;&#039;) {
                throw new InvalidArgumentException(
                    &#039;Name is required&#039;
                );
            }

            $this-&gt;name = $value;
        }
    }

    public private(set) string $email {
        set(string $value) {
            $value = strtolower(trim($value));

            if (
                filter_var(
                    $value,
                    FILTER_VALIDATE_EMAIL
                ) === false
            ) {
                throw new InvalidArgumentException(
                    &#039;Invalid email&#039;
                );
            }

            $this-&gt;email = $value;
        }
    }

    public private(set) int $age {
        set(int $value) {
            if ($value &lt; 18 || $value &gt; 120) {
                throw new InvalidArgumentException(
                    &#039;Age out of range&#039;
                );
            }

            $this-&gt;age = $value;
        }
    }

    public string $label {
        get =&gt; $this-&gt;name
            . &#039; &lt;&#039;
            . $this-&gt;email
            . &#039;&gt;&#039;;
    }

    public function __construct(
        string $name,
        string $email,
        int $age
    ) {
        $this-&gt;name = $name;
        $this-&gt;email = $email;
        $this-&gt;age = $age;
    }
}

$contact = new ContactProfile(
    &#039;  Ada Lovelace  &#039;,
    &#039; ADA@EXAMPLE.COM &#039;,
    28
);

echo $contact-&gt;name . PHP_EOL;
echo $contact-&gt;email . PHP_EOL;
echo $contact-&gt;label . PHP_EOL;</code></pre>



<p class="wp-block-paragraph">The output is:</p>



<pre class="wp-block-code"><code class="" data-line="">Ada Lovelace
ada@example.com
Ada Lovelace &lt;ada@example.com&gt;</code></pre>



<p class="wp-block-paragraph">The name and email address are normalized during assignment. Invalid input causes an exception before the corresponding property receives the new value.</p>



<p class="wp-block-paragraph">The email normalization shown here is deliberately simple. Applications dealing with internationalized addresses or more complex email requirements may need more specialized handling.</p>



<h2 class="wp-block-heading">Asymmetric Visibility: Public Reading, Private Writing</h2>



<p class="wp-block-paragraph">Notice the <code class="" data-line="">public private(set)</code> declarations. These allow the properties to be read publicly while restricting assignments to the defining class.</p>



<p class="wp-block-paragraph">As a result, this operation is allowed:</p>



<pre class="wp-block-code"><code class="" data-line="">echo $contact-&gt;email;</code></pre>



<p class="wp-block-paragraph">But this assignment is prohibited:</p>



<pre class="wp-block-code"><code class="" data-line="">$contact-&gt;email = &#039;other@example.com&#039;;
// Error: property cannot be modified here</code></pre>



<p class="wp-block-paragraph">Importantly, setter hooks do not replace access-control rules. PHP checks whether a write is permitted, and an external assignment cannot bypass a private setter simply because the property declares a hook.</p>



<p class="wp-block-paragraph">With a <code class="" data-line="">final</code> class and no public mutation methods, this design provides a straightforward way to expose a stable, read-only interface after construction.</p>



<h2 class="wp-block-heading">Virtual Properties: Values Without Storage</h2>



<p class="wp-block-paragraph">The <code class="" data-line="">label</code> property in our example introduces another useful capability: virtual properties.</p>



<p class="wp-block-paragraph">Unlike <code class="" data-line="">name</code> or <code class="" data-line="">email</code>, the label does not have its own stored value. Instead, its getter calculates the result from existing properties whenever it is accessed.</p>



<p class="wp-block-paragraph">Before property hooks, developers would normally expose this behavior through a method such as <code class="" data-line="">getLabel()</code>. With PHP 8.4, a computed value can be represented directly as a typed property.</p>



<p class="wp-block-paragraph">This can be convenient for derived information such as formatted names, display labels, calculated totals, or read-only projections of an object&#8217;s existing state.</p>



<p class="wp-block-paragraph">However, virtual properties should remain inexpensive and predictable. Hiding database queries, network requests, or other significant side effects behind an apparently simple property read can make application behavior difficult to understand.</p>



<h2 class="wp-block-heading">Property Hooks Are Not Readonly Properties</h2>



<p class="wp-block-paragraph">One important limitation is that property hooks are not compatible with <code class="" data-line="">readonly</code> properties.</p>



<p class="wp-block-paragraph">Developers designing immutable domain objects should therefore distinguish between the two approaches. A readonly object provides language-enforced restrictions on property modification, while property hooks allow custom access behavior.</p>



<p class="wp-block-paragraph">Asymmetric visibility can restrict writes from outside a class, but it does not automatically create the same guarantees as a readonly class. Internal methods can still modify writable properties.</p>



<p class="wp-block-paragraph">Another consideration involves arrays. Indirect modifications such as changing an individual array element may not behave as expected with hooked properties, because the operation involves references that can bypass normal setter semantics.</p>



<h2 class="wp-block-heading">When Should Developers Use Them?</h2>



<p class="wp-block-paragraph">Property hooks are most useful when a class needs predictable property-level normalization, simple validation, or derived values that naturally belong to the object.</p>



<p class="wp-block-paragraph">They are less appropriate when validation depends on several fields at once, requires external services, or involves complex business workflows. Those responsibilities are often clearer in constructors, factories, or dedicated domain services.</p>



<p class="wp-block-paragraph">For existing applications, there is little reason to replace every getter and setter immediately. Introducing hooks in small, well-tested classes is a more reasonable approach.</p>



<p class="wp-block-paragraph">Property hooks are available starting with PHP 8.4. Applications that still support PHP 8.3 or earlier must retain conventional methods or another compatible implementation.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">PHP 8.4 property hooks offer a useful improvement to object-oriented programming by moving straightforward property behavior closer to its declaration.</p>



<p class="wp-block-paragraph">Combined with asymmetric visibility, they can reduce repetitive code while preserving clear rules about how data is accepted and exposed.</p>



<p class="wp-block-paragraph">The important design question is not whether getters and setters should disappear, but which responsibilities genuinely belong to a property. Used selectively, property hooks can make PHP data models smaller and easier to maintain without sacrificing clarity.</p>



<h2 class="wp-block-heading">Official References</h2>



<ul class="wp-block-list">
<li><a href="https://www.php.net/releases/8.4/en.php">PHP 8.4 Release Announcement</a></li>



<li><a href="https://www.php.net/manual/en/language.oop5.property-hooks.php">PHP Manual — Property Hooks</a></li>



<li><a href="https://www.php.net/manual/en/language.oop5.visibility.php">PHP Manual — Asymmetric Property Visibility</a></li>
</ul>

]]></content>
		
					<link rel="replies" type="text/html" href="https://phpmagazine.net/2026/10/php-84-property-hooks-validated-data-objects.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://phpmagazine.net/2026/10/php-84-property-hooks-validated-data-objects.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Hatem Ben Yacoub</name>
							<uri>http://hbyconsusltancy.com</uri>
						</author>

		<title type="html"><![CDATA[How Freelance Developers Can Build a Maintenance Plan That Pays]]></title>
		<link rel="alternate" type="text/html" href="https://phpmagazine.net/2026/10/freelance-developer-maintenance-plan.html" />

		<id>https://phpmagazine.net/?p=34728</id>
		<updated>2026-10-29T11:02:31Z</updated>
		<published>2026-10-29T11:02:28Z</published>
		<category scheme="https://phpmagazine.net" term="Business &amp; Career" /><category scheme="https://phpmagazine.net" term="Freelancing" /><category scheme="https://phpmagazine.net" term="client management" /><category scheme="https://phpmagazine.net" term="recurring revenue" /><category scheme="https://phpmagazine.net" term="web developmen" /><category scheme="https://phpmagazine.net" term="web maintenance" />
		<summary type="html"><![CDATA[]]></summary>

					<content type="html" xml:base="https://phpmagazine.net/2026/10/freelance-developer-maintenance-plan.html"><![CDATA[

<p class="wp-block-paragraph">Launching a website or web application is rarely the end of the work. Software needs updates, backups need checking, integrations fail, and clients eventually need help. For freelance developers, that ongoing responsibility can become a valuable service—or an endless stream of unplanned work.</p>



<p class="wp-block-paragraph">The difference is the agreement. A good maintenance plan tells the client what is being protected, what the developer will do, and what happens when something falls outside the plan. It gives both sides a practical way to manage the application after launch.</p>



<h2 class="wp-block-heading">Start with the application, not a package name</h2>



<p class="wp-block-paragraph">“Basic,” “Pro,” and “Premium” packages are easy to put on a sales page, but the names alone do not explain the work. A small marketing site and a customer portal may both use PHP, yet their maintenance needs can be very different.</p>



<p class="wp-block-paragraph">Before proposing a plan, review the application’s components: its framework or content management system, dependencies, hosting, database, integrations, backup process, traffic patterns, and business importance. Ask who has access and whether anyone currently monitors failures.</p>



<p class="wp-block-paragraph">That assessment may reveal work that needs to happen before a recurring plan begins. An unsupported dependency, missing backup, or undocumented deployment process should not quietly become an unlimited obligation inside a monthly fee. Offer a separate initial remediation project where appropriate.</p>



<h2 class="wp-block-heading">Describe the service in observable terms</h2>



<p class="wp-block-paragraph">Clients need to know what they are buying. Instead of promising “complete maintenance,” list the activities you will perform and how often. Depending on the application, a plan might include:</p>



<ul class="wp-block-list">
<li>Reviewing and applying eligible software updates on an agreed schedule.</li>



<li>Checking that backups run and periodically testing restoration.</li>



<li>Monitoring specified services and investigating alerts during agreed hours.</li>



<li>Reviewing logs or security notifications for defined issues.</li>



<li>Providing a short report on completed work and outstanding risks.</li>
</ul>



<p class="wp-block-paragraph">Be precise about the limits. An uptime monitor can alert you to a failure, but it does not guarantee that every problem will be detected. A backup is useful only if it can be restored, so explain who tests recovery and how frequently. If the client controls hosting or another vendor manages part of the system, identify those responsibilities too.</p>



<h2 class="wp-block-heading">Separate response time from resolution time</h2>



<p class="wp-block-paragraph">A common source of disagreement is the phrase “24-hour support.” Does it mean the developer will acknowledge a message within 24 hours, begin investigating, or completely fix the problem? Those are three different promises.</p>



<p class="wp-block-paragraph">Define the support channel, business hours, and expected response time for each priority level. For example, a critical production outage might receive an initial response within four business hours, while a minor content request might be reviewed within two business days. These are examples, not universal targets: choose commitments you can actually meet.</p>



<p class="wp-block-paragraph">A response target is not a guarantee of resolution. A third-party outage, a difficult data recovery, or an issue in unsupported code may take longer and require a separate estimate. Explain how the client will be kept informed when that happens.</p>



<h2 class="wp-block-heading">Price for capacity and risk</h2>



<p class="wp-block-paragraph">A maintenance fee must cover more than the visible minutes spent installing updates. It should account for monitoring, administration, client communication, routine checks, tools, and the capacity reserved to respond when something goes wrong.</p>



<p class="wp-block-paragraph">As an illustrative starting point, imagine a plan that requires two hours of routine work per month, plus half an hour for reporting and administration. At an internal target rate of $100 per hour, that is $250 before software costs, contingency, taxes, and profit. The final price should reflect the application’s complexity and the obligations in the agreement.</p>



<p class="wp-block-paragraph">Track actual time and incidents for the first few months. If one application consistently consumes more effort than expected, discuss a revised plan or a separate project to reduce its maintenance burden. A low monthly fee is not a bargain if it prevents the developer from responding reliably.</p>



<h2 class="wp-block-heading">Make extra work easy to approve</h2>



<p class="wp-block-paragraph">New features, redesigns, content production, migrations, and major upgrades often belong outside routine maintenance. State that explicitly and explain how they will be quoted. You might offer an hourly rate, a prepaid block of hours, or a separate fixed-price proposal after assessing the request.</p>



<p class="wp-block-paragraph">A useful plan also explains what happens when the relationship ends: how access is transferred, what documentation is supplied, and when monitoring stops. The goal is a clean handoff rather than uncertainty over who is responsible for a live application.</p>



<p class="wp-block-paragraph">Recurring revenue is attractive, but reliability is the real product. A clear maintenance plan gives the client confidence in what happens after launch and gives the freelancer a service that can be delivered sustainably.</p>

]]></content>
		
					<link rel="replies" type="text/html" href="https://phpmagazine.net/2026/10/freelance-developer-maintenance-plan.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://phpmagazine.net/2026/10/freelance-developer-maintenance-plan.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Hatem Ben Yacoub</name>
							<uri>http://hbyconsusltancy.com</uri>
						</author>

		<title type="html"><![CDATA[Open Source Is Not Your Pricing Strategy: How Small Software Companies Can Build Sustainable Revenue]]></title>
		<link rel="alternate" type="text/html" href="https://phpmagazine.net/2026/10/open-source-commercial-revenue-strategy.html" />

		<id>https://phpmagazine.net/?p=34721</id>
		<updated>2026-10-29T01:38:44Z</updated>
		<published>2026-10-29T03:00:00Z</published>
		<category scheme="https://phpmagazine.net" term="Emerging Trends" /><category scheme="https://phpmagazine.net" term="commercial strategy" /><category scheme="https://phpmagazine.net" term="Developer Tools" /><category scheme="https://phpmagazine.net" term="Open source" /><category scheme="https://phpmagazine.net" term="SAAS" /><category scheme="https://phpmagazine.net" term="software business" /><category scheme="https://phpmagazine.net" term="web applications" />
		<summary type="html"><![CDATA[Open source can be an extraordinary distribution model. It can prove technical quality in public, attract contributors, lower adoption barriers, and build a community around a useful tool. But open source is not, by itself, a business model. This distinction matters for PHP developers, web agencies, and small software companies that create frameworks, libraries, developer [&#8230;]]]></summary>

					<content type="html" xml:base="https://phpmagazine.net/2026/10/open-source-commercial-revenue-strategy.html"><![CDATA[

<p class="wp-block-paragraph">Open source can be an extraordinary distribution model. It can prove technical quality in public, attract contributors, lower adoption barriers, and build a community around a useful tool.</p>



<p class="wp-block-paragraph">But open source is not, by itself, a business model.</p>



<p class="wp-block-paragraph">This distinction matters for PHP developers, web agencies, and small software companies that create frameworks, libraries, developer tools, or self-hosted applications. Publishing code can create attention. It does not automatically create recurring revenue, support capacity, or a sustainable team.</p>



<h2 class="wp-block-heading">The code and the customer value are not always the same thing</h2>



<p class="wp-block-paragraph">The most common commercial mistake is trying to charge for the same thing that made the project attractive in the first place: access to the source code. In many open-source communities, that approach creates friction without solving the underlying problem.</p>



<p class="wp-block-paragraph">A stronger question is: what do organisations pay for once they decide this software matters to them?</p>



<p class="wp-block-paragraph">They may pay for reduced operational risk, managed hosting, reliable upgrades, security assurance, compliance controls, priority support, integrations, deployment guidance, training, or a service-level commitment. These are not artificial limitations added to punish self-hosters. They are real business needs with real operating costs.</p>



<h2 class="wp-block-heading">Choose one primary commercial promise</h2>



<p class="wp-block-paragraph">Small teams often try to monetise through everything at once: donations, consulting, paid plugins, training, hosting, enterprise licensing, sponsorship, and merchandise. Diversification can help later, but too many paths at the start usually create confusion.</p>



<p class="wp-block-paragraph">Choose one primary promise that matches the product and the buyer. A developer analytics tool might lead with hosted reliability. A self-hosted PHP application might lead with enterprise support and regulated deployment. A framework-adjacent product might lead with training and implementation services.</p>



<p class="wp-block-paragraph">The commercial offer must be easy to explain in one sentence. If a prospective customer cannot tell why they should pay, they will delay the decision indefinitely.</p>



<h2 class="wp-block-heading">Hosted convenience is often the cleanest path</h2>



<p class="wp-block-paragraph">For many web applications, a hosted offering is the most natural commercial layer. The open-source edition gives technical teams control and confidence. The hosted edition gives organisations time back.</p>



<p class="wp-block-paragraph">That value includes more than server space. It includes backups, monitoring, upgrades, secure defaults, incident response, performance tuning, and someone who is accountable when the service matters at 2 a.m.</p>



<p class="wp-block-paragraph">A hosted offer works best when it is genuinely better for the buyer’s situation, not when it is merely the only version that receives care. Self-hosting should remain viable for the audience the project claims to support. The hosted product should win through convenience, reliability, and operational maturity.</p>



<h2 class="wp-block-heading">Support needs boundaries</h2>



<p class="wp-block-paragraph">Support is valuable, but unlimited support is a quiet way to destroy a small company. Define response targets, supported versions, communication channels, and what qualifies as an incident. Publish the boundaries before the first enterprise customer arrives.</p>



<p class="wp-block-paragraph">Community support and commercial support can coexist. Community spaces are ideal for shared questions, implementation ideas, and collaboration. Paid support should provide accountable help for organisations with deadlines, production systems, and internal stakeholders.</p>



<h2 class="wp-block-heading">Do not confuse adoption with willingness to pay</h2>



<p class="wp-block-paragraph">Downloads, GitHub stars, newsletter subscribers, and social engagement are useful signals. They are not revenue forecasts. A project can be widely admired by individual developers and still have no clear economic buyer.</p>



<p class="wp-block-paragraph">Before investing heavily in a commercial layer, speak with organisations that use the software in production. Ask what costs them time, where they face risk, what prevents adoption, and who owns the budget. Their answers should shape the offer more than online applause does.</p>



<h2 class="wp-block-heading">Protect trust as carefully as revenue</h2>



<p class="wp-block-paragraph">Open source succeeds when users believe the project’s intentions are coherent. A sudden licence change, an artificial feature wall, or promises that cannot be maintained can damage that trust quickly.</p>



<p class="wp-block-paragraph">The sustainable approach is simpler: keep the open project useful, state what the company sells, and make the paid offer valuable enough that the right customers are happy to buy it.</p>



<p class="wp-block-paragraph">Open source can be the foundation of an excellent software business. It just cannot be the entire plan.</p>

]]></content>
		
					<link rel="replies" type="text/html" href="https://phpmagazine.net/2026/10/open-source-commercial-revenue-strategy.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://phpmagazine.net/2026/10/open-source-commercial-revenue-strategy.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Hatem Ben Yacoub</name>
							<uri>http://hbyconsusltancy.com</uri>
						</author>

		<title type="html"><![CDATA[Why Web Agencies Need a “Change Budget” Before They Need More Clients]]></title>
		<link rel="alternate" type="text/html" href="https://phpmagazine.net/2026/10/web-agency-change-budget-client-work.html" />

		<id>https://phpmagazine.net/?p=34717</id>
		<updated>2026-10-29T01:46:53Z</updated>
		<published>2026-10-29T01:34:03Z</published>
		<category scheme="https://phpmagazine.net" term="Business Management" /><category scheme="https://phpmagazine.net" term="Featured" /><category scheme="https://phpmagazine.net" term="client management" /><category scheme="https://phpmagazine.net" term="digital services" /><category scheme="https://phpmagazine.net" term="profitability" /><category scheme="https://phpmagazine.net" term="project scope" /><category scheme="https://phpmagazine.net" term="web agency" />
		<summary type="html"><![CDATA[]]></summary>

					<content type="html" xml:base="https://phpmagazine.net/2026/10/web-agency-change-budget-client-work.html"><![CDATA[

<p class="wp-block-paragraph">Most web agencies do not lose money because they cannot build good software. They lose money because the work changes while the commercial agreement stays frozen.</p>



<p class="wp-block-paragraph">A client sees a website, an application, or a redesign as a living business asset. Once the project begins, they learn more. A new stakeholder appears. A competitor launches something unexpected. A marketing campaign changes direction. A feature that looked optional becomes essential.</p>



<p class="wp-block-paragraph">None of this is unusual. The mistake is treating change as a failure of planning rather than a normal cost of building digital products.</p>



<h2 class="wp-block-heading">The hidden cost of “just one small change”</h2>



<p class="wp-block-paragraph">Small requests rarely remain small in a web project. A new field in a form can affect validation, database structure, emails, analytics, privacy documentation, mobile layouts, translations, tests, and support material. A new user role can affect permissions throughout an application.</p>



<p class="wp-block-paragraph">When an agency accepts these requests informally, it creates two problems at once. The agency absorbs unplanned work, while the client never sees the real trade-off behind the decision. Over time, both sides become frustrated: the client feels that delivery is slow, and the agency feels that every project is becoming unprofitable.</p>



<p class="wp-block-paragraph">The answer is not to say no to every change. It is to make change visible, budgeted, and easy to discuss.</p>



<h2 class="wp-block-heading">Create a change budget at the start</h2>



<p class="wp-block-paragraph">A change budget is a defined amount of time or money reserved for decisions that cannot reasonably be made before work begins. It is not a vague contingency hidden inside the estimate. It is a named part of the commercial agreement.</p>



<p class="wp-block-paragraph">For example, a fixed-price project might include a 10% change reserve. A €40,000 project would therefore identify €4,000 specifically for approved adjustments. A time-and-materials engagement can set aside a defined number of hours per month. A retained client might receive a quarterly improvement budget that is separate from routine support.</p>



<p class="wp-block-paragraph">The client should understand three things from day one:</p>



<ul class="wp-block-list">
<li>The reserve exists because useful discoveries will happen during delivery.</li>



<li>Using it is normal and does not mean the project has failed.</li>



<li>Once it is exhausted, the client chooses: add budget, remove lower-priority work, or move the request to a later phase.</li>
</ul>



<h2 class="wp-block-heading">Turn changes into decisions, not arguments</h2>



<p class="wp-block-paragraph">The operational part matters as much as the contract. Every requested change needs a short decision record. It does not need legal language or a long document. It needs clarity.</p>



<p class="wp-block-paragraph">A useful record answers five questions: What is changing? Why does it matter now? What will it affect? What will it cost in time or money? What will be delayed, removed, or funded as a result?</p>



<p class="wp-block-paragraph">That final question is the one agencies often skip. If everything is “important,” then nothing is being prioritised. A change budget forces the client and agency to make the trade-off together, while there is still time to act on it.</p>



<h2 class="wp-block-heading">Use the budget to improve trust</h2>



<p class="wp-block-paragraph">Many agency owners worry that discussing change will make the relationship feel transactional. In practice, the opposite is usually true. Clients lose trust when surprises appear late, or when they discover that “included” work was quietly paid for through rushed delivery and exhausted teams.</p>



<p class="wp-block-paragraph">A visible change budget gives the client a legitimate path to adapt. It also lets the agency respond constructively: “Yes, we can do that. Here is what it uses, and here are the options.”</p>



<p class="wp-block-paragraph">This is a more mature conversation than either automatic acceptance or automatic refusal.</p>



<h2 class="wp-block-heading">Measure what the budget teaches you</h2>



<p class="wp-block-paragraph">After several projects, review where change budgets were spent. If most of the reserve goes to integrations, your discovery process may be underestimating third-party systems. If it repeatedly goes to content and approvals, your project plan may need earlier stakeholder workshops. If the same feature requests return across clients, you may have discovered a productised service opportunity.</p>



<p class="wp-block-paragraph">Change is not merely a cost to control. It is information about what clients actually need.</p>



<p class="wp-block-paragraph">The agencies that protect their margins best are not the ones that predict every detail perfectly. They are the ones that give inevitable uncertainty a price, a process, and a place in the relationship.</p>




<p class="wp-block-paragraph"></p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://phpmagazine.net/2026/10/web-agency-change-budget-client-work.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://phpmagazine.net/2026/10/web-agency-change-budget-client-work.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>PHP Magazine Network</name>
							<uri>https://phpmagazine.net</uri>
						</author>

		<title type="html"><![CDATA[Node.js 27 Marks a New ReleaseStrategy: Annual Majors, AlphaBuilds, and a Different Path to LTS]]></title>
		<link rel="alternate" type="text/html" href="https://phpmagazine.net/2026/10/nodejs-27-annual-release-cycle-alpha-lts.html" />

		<id>https://phpmagazine.net/?p=34698</id>
		<updated>2026-10-28T15:44:50Z</updated>
		<published>2026-10-28T17:00:00Z</published>
		<category scheme="https://phpmagazine.net" term="News &amp; Trends" /><category scheme="https://phpmagazine.net" term="automation" /><category scheme="https://phpmagazine.net" term="CI/CD" /><category scheme="https://phpmagazine.net" term="Dependency Management" /><category scheme="https://phpmagazine.net" term="devops" /><category scheme="https://phpmagazine.net" term="github" /><category scheme="https://phpmagazine.net" term="GitHub Actions" /><category scheme="https://phpmagazine.net" term="Security" /><category scheme="https://phpmagazine.net" term="Software Supply Chain" />
		<summary type="html"><![CDATA[]]></summary>

					<content type="html" xml:base="https://phpmagazine.net/2026/10/nodejs-27-annual-release-cycle-alpha-lts.html"><![CDATA[

<p class="wp-block-paragraph"><strong>Node.js is entering a new phase in its release strategy. Beginning with Node.js 27, the project is moving from two major releases per year to one, while introducing an Alpha channel and eliminating the distinction between odd-numbered and even-numbered release lines.</strong></p>



<p class="wp-block-paragraph">The new schedule begins its transition in October 2026, with the Node.js 27 Alpha cycle scheduled to start on October 28. The first stable Node.js 27 release is planned for April 2027, followed by Long-Term Support later that year.</p>



<p class="wp-block-paragraph">This is more than a change in version numbering. It reflects how the JavaScript server ecosystem has evolved, how developers adopt new releases, and how a largely volunteer-maintained project manages its long-term support responsibilities.</p>



<h2 class="wp-block-heading">Why Node.js Is Changing Its Release Schedule</h2>



<p class="wp-block-paragraph">For approximately a decade, Node.js followed a predictable pattern: two major versions each year, with an even-numbered release in the spring and an odd-numbered release in the autumn.</p>



<p class="wp-block-paragraph">Even-numbered releases eventually entered Long-Term Support, while odd-numbered releases had comparatively short lifetimes.</p>



<p class="wp-block-paragraph">This arrangement gave developers early access to new functionality while providing production environments with a stable release line.</p>



<p class="wp-block-paragraph">However, the Node.js Release Working Group has acknowledged that adoption patterns have changed.</p>



<p class="wp-block-paragraph">Many organizations avoid odd-numbered releases entirely, preferring to wait for LTS versions. As a result, the project has been maintaining release lines that receive relatively limited production adoption.</p>



<p class="wp-block-paragraph">Maintaining multiple active versions also creates substantial work for the project&#8217;s contributors, particularly when security vulnerabilities require patches across several branches.</p>



<p class="wp-block-paragraph">The revised schedule attempts to simplify this situation without sacrificing the predictability that enterprise users expect.</p>



<h2 class="wp-block-heading">One Major Release Every Year</h2>



<p class="wp-block-paragraph">Starting with Node.js 27, the project will publish one major stable release each April.</p>



<p class="wp-block-paragraph">Every major version will eventually enter Long-Term Support. The previous distinction between odd-numbered and even-numbered releases will disappear.</p>



<p class="wp-block-paragraph">Under the new model, each release line moves through three principal phases:</p>



<ul class="wp-block-list">
<li><strong>Alpha:</strong> Approximately six months, beginning in October, for early compatibility testing and potentially breaking changes.</li>



<li><strong>Current:</strong> Approximately six months, beginning with the stable major release in April.</li>



<li><strong>LTS:</strong> Approximately 30 months of long-term support, beginning in October.</li>
</ul>



<p class="wp-block-paragraph">The project plans approximately 36 months of support from the first stable major release to end of life.</p>



<p class="wp-block-paragraph">For production users who already wait for LTS releases, the practical upgrade rhythm remains broadly similar. The main difference is that every annual major version will now follow the path to LTS.</p>



<h2 class="wp-block-heading">Node.js 27 Introduces the Alpha Phase</h2>



<p class="wp-block-paragraph">The most significant addition is the new Alpha channel.</p>



<p class="wp-block-paragraph">Unlike traditional nightly builds, Alpha releases are intended to be signed, tagged, and tested through the project&#8217;s established compatibility-testing infrastructure.</p>



<p class="wp-block-paragraph">They are designed primarily for library maintainers, framework developers, and teams responsible for compatibility testing.</p>



<p class="wp-block-paragraph">During the Alpha phase, the project may introduce semver-major changes. APIs and binary interfaces may therefore change between Alpha releases.</p>



<p class="wp-block-paragraph">This flexibility gives maintainers an opportunity to identify compatibility problems before the stable major release.</p>



<p class="wp-block-paragraph">It also creates a clearer distinction between experimental compatibility testing and production deployment.</p>



<p class="wp-block-paragraph">The Release Working Group explicitly states that Alpha builds are not intended for production use.</p>



<h2 class="wp-block-heading">The Node.js 27 Timeline</h2>



<p class="wp-block-paragraph">According to the project&#8217;s published release schedule, the principal milestones for Node.js 27 are:</p>



<ul class="wp-block-list">
<li>October 28, 2026: Scheduled beginning of the Alpha cycle.</li>



<li>April 22, 2027: Planned first stable Node.js 27 release.</li>



<li>October 20, 2027: Planned transition to LTS.</li>



<li>April 30, 2030: Planned end of support.</li>
</ul>



<p class="wp-block-paragraph">These dates represent the project&#8217;s current schedule and may change.</p>



<p class="wp-block-paragraph">Importantly, the start of a scheduled Alpha phase should not be confused with confirmation that a particular Alpha binary is available for download. Developers should consult the official release channels before installing a prerelease build.</p>



<h2 class="wp-block-heading">What Happens to Node.js 26?</h2>



<p class="wp-block-paragraph">Node.js 26 remains the final release line under the previous schedule.</p>



<p class="wp-block-paragraph">Its LTS transition is scheduled for October 28, 2026. The project&#8217;s release-status page still identifies the latest published Node.js 26.12.1 build, released on October 21, as a Current release.</p>



<p class="wp-block-paragraph">Node.js 26 is expected to enter maintenance in October 2027 and reach end of life in April 2029.</p>



<p class="wp-block-paragraph">Teams using Node.js 24 LTS should not interpret the arrival of Node.js 27&#8217;s Alpha cycle as a requirement to upgrade immediately.</p>



<p class="wp-block-paragraph">Production upgrade decisions should continue to follow supported release status, dependency compatibility, application requirements, and operational testing.</p>



<h2 class="wp-block-heading">Why Library Maintainers Should Pay Attention</h2>



<p class="wp-block-paragraph">The new Alpha phase is especially relevant for maintainers of npm packages, web frameworks, native addons, and development tools.</p>



<p class="wp-block-paragraph">Under the previous model, many projects tested compatibility against Current and LTS versions, while odd-numbered releases provided an additional opportunity to identify upcoming changes.</p>



<p class="wp-block-paragraph">With the new annual schedule, maintainers who test only against LTS releases may discover compatibility problems much later in the development cycle.</p>



<p class="wp-block-paragraph">The Node.js project therefore encourages library authors to incorporate Alpha releases into their continuous integration workflows as early as practical.</p>



<p class="wp-block-paragraph">Such tests should generally be treated as experimental compatibility checks rather than mandatory production release gates.</p>



<p class="wp-block-paragraph">A failure against an Alpha build may reveal an upcoming breaking change, but it may also reflect behavior that will change again before the stable release.</p>



<h2 class="wp-block-heading">A More Predictable Upgrade Strategy</h2>



<p class="wp-block-paragraph">For application teams, the new schedule creates an opportunity to simplify version-management policies.</p>



<p class="wp-block-paragraph">Instead of tracking alternating short-lived and long-lived major releases, organizations can plan around a yearly stable release followed by a predictable LTS transition.</p>



<p class="wp-block-paragraph">A practical strategy is to maintain production environments on supported LTS versions, test upcoming stable versions before their LTS promotion, and use Alpha builds only in isolated compatibility-testing environments.</p>



<p class="wp-block-paragraph">Teams should also review their package engine constraints, CI matrices, container base images, and native dependencies whenever a new major release approaches.</p>



<p class="wp-block-paragraph">For applications using native addons, binary compatibility deserves particular attention because a new major Node.js version can introduce changes that require updated dependencies or rebuilt binaries.</p>



<h2 class="wp-block-heading">A Sustainability Decision as Much as a Technical One</h2>



<p class="wp-block-paragraph">The release schedule also reflects an important reality of open-source infrastructure: maintenance capacity is finite.</p>



<p class="wp-block-paragraph">Node.js is a widely deployed runtime, but much of its maintenance work is performed by volunteers.</p>



<p class="wp-block-paragraph">Supporting fewer concurrent release lines can reduce the complexity of backporting security fixes, testing compatibility, and preparing releases.</p>



<p class="wp-block-paragraph">The objective is not simply to release software less frequently. It is to allocate development and maintenance effort more effectively while preserving the reliability expected by production users.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">The move to annual major releases represents a meaningful evolution in how Node.js balances innovation, compatibility, and long-term maintenance.</p>



<p class="wp-block-paragraph">For production application developers, the transition should preserve much of the familiar LTS upgrade rhythm.</p>



<p class="wp-block-paragraph">For library maintainers, the new Alpha channel creates an earlier opportunity to test compatibility and report problems before they reach stable releases.</p>



<p class="wp-block-paragraph">Node.js 27 will be the first major release to follow this model. Its success will depend not only on the release process itself, but also on how effectively the broader JavaScript ecosystem uses the additional testing window.</p>



<h2 class="wp-block-heading">Official References</h2>



<ul class="wp-block-list">
<li><a href="https://nodejs.org/en/blog/announcements/evolving-the-nodejs-release-schedule">Node.js — Evolving the Release Schedule, March 10, 2026</a></li>



<li><a href="https://nodejs.org/en/about/previous-releases">Node.js — Official Release Status</a></li>



<li><a href="https://github.com/nodejs/Release">Node.js Release Working Group — Release Schedule</a></li>



<li><a href="https://nodejs.org/en/blog/release/v26.12.1">Node.js 26.12.1 Release Notes — October 21, 2026</a></li>
</ul>

]]></content>
		
					<link rel="replies" type="text/html" href="https://phpmagazine.net/2026/10/nodejs-27-annual-release-cycle-alpha-lts.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://phpmagazine.net/2026/10/nodejs-27-annual-release-cycle-alpha-lts.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Hatem Ben Yacoub</name>
							<uri>http://hbyconsusltancy.com</uri>
						</author>

		<title type="html"><![CDATA[GitHub Actions Introduces Workflow Lockfiles: A Practical Step Toward Reproducible Ci/CD]]></title>
		<link rel="alternate" type="text/html" href="https://phpmagazine.net/2026/10/github-actions-workflow-lockfiles-reproduc-ible-cicd.html" />

		<id>https://phpmagazine.net/?p=34695</id>
		<updated>2026-10-28T15:12:30Z</updated>
		<published>2026-10-28T16:00:00Z</published>
		<category scheme="https://phpmagazine.net" term="Cloud and DevOps" /><category scheme="https://phpmagazine.net" term="DevOps Methodologies and Tools" /><category scheme="https://phpmagazine.net" term="automation" /><category scheme="https://phpmagazine.net" term="CI/CD" /><category scheme="https://phpmagazine.net" term="Dependency Management" /><category scheme="https://phpmagazine.net" term="devops" /><category scheme="https://phpmagazine.net" term="github" /><category scheme="https://phpmagazine.net" term="GitHub Actions" /><category scheme="https://phpmagazine.net" term="Security" /><category scheme="https://phpmagazine.net" term="Software Supply Chain" />
		<summary type="html"><![CDATA[]]></summary>

					<content type="html" xml:base="https://phpmagazine.net/2026/10/github-actions-workflow-lockfiles-reproduc-ible-cicd.html"><![CDATA[

<p class="wp-block-paragraph"><strong>GitHub Actions has introduced workflow dependency lockfiles in public preview, addressing a long-standing weakness in CI/CD security: the code executed by a workflow can change even when the workflow configuration does not.</strong></p>



<p class="wp-block-paragraph">Announced on October 14, 2026, the feature allows repositories to record the exact commits used by their workflow dependencies, including transitive dependencies. It provides a more systematic alternative to manually pinning every action to a commit SHA.</p>



<p class="wp-block-paragraph">The change is particularly relevant for teams that depend on third-party GitHub Actions to build, test, package, and deploy their applications.</p>



<h2 class="wp-block-heading">The Problem with Mutable Action References</h2>



<p class="wp-block-paragraph">Most GitHub Actions workflows reference external actions using version tags:</p>



<pre class="wp-block-code"><code class="" data-line="">name: CI

on:
  push:
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Run tests
        run: echo &quot;Running tests&quot;</code></pre>



<p class="wp-block-paragraph">The syntax is convenient and readable. However, Git tags are references, not immutable guarantees.</p>



<p class="wp-block-paragraph">If a tag is moved to another commit, a subsequent workflow execution can run different code without any modification to the consuming repository.</p>



<p class="wp-block-paragraph">In ordinary circumstances, maintainers may move tags as part of their release process. In a compromised repository, the same mechanism can become a software supply-chain attack vector.</p>



<p class="wp-block-paragraph">Historically, GitHub has recommended pinning third-party actions to complete commit SHAs. That approach provides stronger reproducibility, but it can make workflow files harder to read and does not automatically solve the problem of dependencies used internally by composite actions.</p>



<h2 class="wp-block-heading">What Workflow Lockfiles Change</h2>



<p class="wp-block-paragraph">The new feature introduces a repository-level file named:</p>



<pre class="wp-block-code"><code class="" data-line="">.github/workflows/actions.lock</code></pre>



<p class="wp-block-paragraph">This file records the dependencies used by onboarded workflows and the exact commits to which those dependencies resolve.</p>



<p class="wp-block-paragraph">When an onboarded workflow runs, GitHub Actions uses the commits recorded in the lockfile rather than resolving a potentially changed tag or branch reference.</p>



<p class="wp-block-paragraph">The lockfile also records repository identity information, helping distinguish a trusted repository from another repository that might later appear under the same name.</p>



<p class="wp-block-paragraph">This is an important improvement because securing CI/CD dependencies involves more than selecting a version number. It also requires knowing which repository supplied the code and whether the executed content matches what was reviewed.</p>



<h2 class="wp-block-heading">Generating a Lockfile</h2>



<p class="wp-block-paragraph">GitHub provides a CLI extension named <code class="" data-line="">gh-actions-lock</code> for creating and maintaining workflow lockfiles.</p>



<p class="wp-block-paragraph">After installing the GitHub CLI and authenticating, install the extension:</p>



<pre class="wp-block-code"><code class="" data-line="">gh extension install github/gh-actions-lock</code></pre>



<p class="wp-block-paragraph">From the root of a repository, run:</p>



<pre class="wp-block-code"><code class="" data-line="">gh actions-lock</code></pre>



<p class="wp-block-paragraph">The extension scans the repository&#8217;s workflows, resolves supported dependencies, and generates the lockfile.</p>



<p class="wp-block-paragraph">It may also update action references in workflow files to more specific versions. Developers should therefore review the entire Git diff rather than examining only the generated lockfile.</p>



<p class="wp-block-paragraph">Teams can also introduce locking gradually. To onboard one workflow:</p>



<pre class="wp-block-code"><code class="" data-line="">gh actions-lock .github/workflows/ci.yml</code></pre>



<p class="wp-block-paragraph">This is useful for organizations with many repositories or complex workflows. A pilot can establish whether the generated dependencies are correct before the approach is adopted more widely.</p>



<h2 class="wp-block-heading">Verifying Dependencies in CI</h2>



<p class="wp-block-paragraph">A lockfile provides little protection if developers can modify workflows without updating or reviewing the corresponding dependency records.</p>



<p class="wp-block-paragraph">GitHub&#8217;s documentation recommends integrating verification into the development process.</p>



<p class="wp-block-paragraph">For example:</p>



<pre class="wp-block-code"><code class="" data-line="">gh actions-lock --verify</code></pre>



<p class="wp-block-paragraph">This command checks whether the lockfile remains consistent with the workflow dependencies.</p>



<p class="wp-block-paragraph">For a lightweight local check, developers can use:</p>



<pre class="wp-block-code"><code class="" data-line="">gh actions-lock --verify-local --no-fix</code></pre>



<p class="wp-block-paragraph">The local verification operates without network access. It checks dependency coverage but does not revalidate every pinned commit against GitHub.</p>



<p class="wp-block-paragraph">These checks can be integrated into pre-commit hooks and pull-request workflows to detect stale lockfiles before changes are merged.</p>



<h2 class="wp-block-heading">Handling Transitive Dependencies</h2>



<p class="wp-block-paragraph">One of the more interesting aspects of workflow lockfiles is their support for transitive dependencies.</p>



<p class="wp-block-paragraph">A composite action may invoke other actions internally. Pinning only the top-level action does not necessarily make every dependency visible to the consuming repository.</p>



<p class="wp-block-paragraph">The new lockfile mechanism can record these nested dependencies, improving the visibility of code executed during workflow runs.</p>



<p class="wp-block-paragraph">There is an important exception: dependencies inside a reusable workflow are governed by the lockfile in the repository where that reusable workflow is defined.</p>



<p class="wp-block-paragraph">Organizations maintaining shared reusable workflows should therefore consider onboarding those repositories before introducing lockfile enforcement across consuming applications.</p>



<h2 class="wp-block-heading">Keeping Dependencies Updated</h2>



<p class="wp-block-paragraph">Locking dependencies creates a new maintenance responsibility. Once a dependency is pinned, it will not automatically move to a newer commit simply because an upstream tag changes.</p>



<p class="wp-block-paragraph">This is desirable from a reproducibility perspective, but it means security updates must be managed deliberately.</p>



<p class="wp-block-paragraph">GitHub has integrated the feature with Dependabot. When Dependabot updates an action reference in a workflow already using lockfiles, it can regenerate the corresponding lockfile entry in the same pull request.</p>



<p class="wp-block-paragraph">That allows reviewers to examine both the version change and the exact commit that will execute.</p>



<p class="wp-block-paragraph">GitHub also recommends protecting the lockfile through CODEOWNERS and requiring appropriate reviews when dependency records change.</p>



<h2 class="wp-block-heading">What Lockfiles Do Not Solve</h2>



<p class="wp-block-paragraph">A lockfile guarantees neither the quality nor the security of the dependency it records.</p>



<p class="wp-block-paragraph">If a malicious or vulnerable action is already present when the lockfile is generated, locking it simply preserves that exact version.</p>



<p class="wp-block-paragraph">Teams still need dependency reviews, appropriate workflow permissions, secure handling of credentials, and a process for responding to security advisories.</p>



<p class="wp-block-paragraph">Lockfiles also do not automatically make every build reproducible. Package managers, external downloads, container images, and build tools can introduce additional mutable dependencies.</p>



<p class="wp-block-paragraph">The feature should therefore be viewed as one component of a broader software supply-chain security strategy.</p>



<h2 class="wp-block-heading">Availability and Preview Limitations</h2>



<p class="wp-block-paragraph">Workflow dependency lockfiles entered public preview on October 14, 2026. GitHub announced access for Free, Team, GitHub Enterprise Cloud, and Enterprise Cloud with data residency.</p>



<p class="wp-block-paragraph">As a preview feature, its behavior and tooling may change before general availability.</p>



<p class="wp-block-paragraph">Organizations should evaluate compatibility with existing action allowlists, repository policies, and reusable workflows before making lockfile enforcement mandatory.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">GitHub Actions workflow lockfiles address a practical security problem that has existed for years: the difference between reviewing a workflow configuration and knowing exactly which code will execute.</p>



<p class="wp-block-paragraph">By recording direct and transitive dependencies, the feature makes workflow execution more predictable and dependency changes easier to audit.</p>



<p class="wp-block-paragraph">It is not a complete supply-chain security solution, but it provides a useful foundation for teams that want stronger control over their CI/CD environments.</p>



<p class="wp-block-paragraph">For organizations already using GitHub Actions extensively, a small pilot with a non-critical repository is a reasonable place to begin.</p>



<h2 class="wp-block-heading">Official References</h2>



<ul class="wp-block-list">
<li><a href="https://github.blog/changelog/2026-10-14-github-actions-workflow-lockfiles-in-public-preview/">GitHub Changelog — Workflow Lockfiles Public Preview, October 14, 2026</a></li>



<li><a href="https://docs.github.com/en/actions/how-tos/secure-your-work/lock-workflow-dependencies">GitHub Docs — Locking Action Dependencies</a></li>



<li><a href="https://docs.github.com/en/enterprise-cloud@latest/actions/concepts/security/workflow-dependency-lockfiles">GitHub Docs — Workflow Dependency Lockfiles</a></li>



<li><a href="https://docs.github.com/en/actions/how-tos/administer/enforce-workflow-lockfiles">GitHub Docs — Enforcing Workflow Lockfiles</a></li>
</ul>

]]></content>
		
					<link rel="replies" type="text/html" href="https://phpmagazine.net/2026/10/github-actions-workflow-lockfiles-reproduc-ible-cicd.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://phpmagazine.net/2026/10/github-actions-workflow-lockfiles-reproduc-ible-cicd.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
	</feed>

<!-- plugin=object-cache-pro client=phpredis metric#hits=3521 metric#misses=8 metric#hit-ratio=99.8 metric#bytes=1800939 metric#prefetches=81 metric#store-reads=58 metric#store-writes=4 metric#store-hits=178 metric#store-misses=2 metric#sql-queries=2 metric#ms-total=306.21 metric#ms-cache=11.26 metric#ms-cache-avg=0.1847 metric#ms-cache-ratio=3.7 sample#redis-hits=17254115 sample#redis-misses=410497 sample#redis-hit-ratio=97.7 sample#redis-ops-per-sec=30 sample#redis-evicted-keys=0 sample#redis-used-memory=147376424 sample#redis-used-memory-rss=86855680 sample#redis-memory-fragmentation-ratio=0.6 sample#redis-connected-clients=1 sample#redis-tracking-clients=0 sample#redis-rejected-connections=0 sample#redis-keys=98434 -->
