iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more
Antihost offers Linux VPS plans with full root access, unlimited traffic on a 1 Gbps port and a 14-day free trial.
Start with a configuration test, not another restart. Run sudo apache2ctl configtest on Debian or Ubuntu, or sudo apachectl configtest on RHEL-family systems. Apache should return Syntax OK. If it names a file and line, correct that PHP or Apache configuration before changing service state. If the syntax is valid, use the service journal, Apache’s ErrorLog, and listener checks to find a port, permission, dependency, or runtime problem.
Use this recovery sequence first
The commands differ by distribution, and RHEL 9 normally uses PHP-FPM rather than loading PHP directly into Apache. Follow the branch that matches your server.
Free tools Windows power users keep installed
One-click scans. No signup required.
- Record the complete failure and the service status. On Debian or Ubuntu run
sudo systemctl status apache2 --no-pager -l. On RHEL or Fedora runsudo systemctl status httpd --no-pager -l. - Read this boot’s service events. Use
sudo journalctl -u apache2 -b --no-pagerfor Debian or Ubuntu, orsudo journalctl -u httpd -b --no-pagerfor RHEL and Fedora. - Test the configuration explicitly:
sudo apache2ctl configteston Debian or Ubuntu, andsudo apachectl configteston RHEL, Fedora, or a source installation. - If the result is not Syntax OK, open the named file at the named line, fix the first error, and run the test again. Do not keep restarting a configuration that fails the test.
- Inspect the enabled PHP integration. Debian and Ubuntu commonly use the
libapache2-mod-phppackage; RHEL 9 uses PHP-FPM and FastCGI by default. - Only after the test passes, restart the correct services. Use
sudo systemctl restart apache2.serviceon Debian or Ubuntu. On RHEL 9, make suresudo systemctl start php-fpmsucceeds, then runsudo systemctl restart httpd. - Verify an actual HTTP request with a temporary
phpinfo()page, then delete that page immediately.
Identify the integration model before changing files
Installing PHP does not configure every Linux distribution in the same way. A common cause of a failed restart is applying an Ubuntu-style module fix to a RHEL server, or retaining an old module configuration after changing PHP versions.
| System family | Apache service | PHP integration | Important configuration locations | Restart sequence |
|---|---|---|---|---|
| Debian or Ubuntu | apache2 |
Usually libapache2-mod-php, loaded as an Apache module |
/etc/apache2/mods-enabled/php*.load and /etc/apache2/mods-enabled/php*.conf |
sudo systemctl restart apache2.service |
| RHEL 9 and related RHEL-family systems | httpd |
PHP-FPM through FastCGI by default; mod_php has been removed from RHEL 9 |
/etc/httpd/conf/httpd.conf, /etc/httpd/conf.d/php.conf, /etc/php-fpm.conf, and /etc/php-fpm.d/www.conf |
Start or restart php-fpm, then restart httpd |
On RHEL 9, Apache does not normally load a libphp*.so module. A hand-copied LoadModule line from an older installation can therefore break startup even though PHP itself is installed.
#1 Best Overall
- Powerful Turbo Fan:CAGIWIRU Electric Air Duster have reached speed up to 130000RPM,Can efficient remove dust and debris.With LED light and Three Adjustable Speed to meet with different cleaning tasks.
- With Attached USB C Fasting Charging cable.Charing 3 hours,Enjoy up to 240 minutes of use on the lowest setting, For third speed can use for 25mins.with four charging options to meet with your needs.
- Wide Application:Upgraded attached 5 different nozzles,making it suitable for a variety of scenes, such as car,pet, pc, keyboards, and other electronic devices. It also serves for office and home clean duster.
- Handy Design & Portable:Cordless air duster electric nozzle is Light weight and small size, design and comfortable to hold and space saving, convenient to carry around. You can put it in your room or inside the car without taking up space.
- Warranty & Support: Our Electric air duster comes with 5 years warranty and 24/7 customer service. During this period, if you have any questions,pls kindly feel free to contact us.
Capture the exact failure before editing
Check the service status
Systemd’s summary often contains the first useful clue, but its default output can truncate long command lines. Keep the full output with --no-pager -l. Note whether the failed unit is Apache itself or, on an FPM setup, php-fpm.service.
Read the boot journal
The boot-qualified journal command shows recent events without mixing in older, unrelated failures. Look for the earliest fatal message rather than the final generic statement that the control process exited with an error code. On a PHP-FPM system, also run sudo journalctl -u php-fpm -b --no-pager when the FPM unit failed.
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →Check Apache’s ErrorLog
Apache writes fatal startup messages to the console or its configured ErrorLog. The first concrete line usually identifies a file, directive, shared object, socket, permission, or listener. A generic systemd message is not enough to diagnose the cause.
Run configtest before another restart
Apache’s explicit syntax test is the fastest way to separate a bad configuration from a runtime startup problem:
- Debian or Ubuntu:
sudo apache2ctl configtest - RHEL, Fedora, or a source installation:
sudo apachectl configtest
A successful test prints Syntax OK. Apache’s restart operation also performs a configuration check automatically, but running configtest first exposes the exact error without first attempting to stop and start the daemon. If a file and line number are reported, fix that location and repeat the test until it passes.
Repair the common PHP-related syntax failures
Stale or missing LoadModule and libphp*.so
An error such as Cannot load ... libphp*.so means Apache is being told to load a shared object that is absent, moved, or incompatible with the installed Apache and PHP packages. Typical causes are a removed PHP version, a manually copied module, or a package upgrade that left an old versioned enablement file behind.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Do not replace the path with a guessed filename. Install the distribution’s matching Apache integration package, remove stale versioned enablement, and let the package-managed configuration provide the module. On Debian or Ubuntu, the relevant package is commonly libapache2-mod-php. On RHEL 9, remove an obsolete direct PHP module reference and use the documented PHP-FPM configuration instead.
Unknown PHP directives
An Unknown directive error indicates that Apache does not have the module that defines the directive, or that the directive belongs to a different PHP or Apache version. Remove or update the directive according to the active integration model; do not silence the error by commenting out unrelated configuration. Run configtest after each focused change so the next reported line is meaningful.
Rank #2
- Screen Cleaner is Your Screen’s New Bestfriend! - EVEO is proud to present a screen cleaner that’s perfectly suited for your TV. Meet your new screen cleaner, computer screen cleaner, laptop cleaner, iPad cleaner, Macbook,tv cleaner or any other electronic device. Our screen cleaner spray and wipe along with the included plush microfiber cloth, easily removes dust, fingerprints & other smudges on the screen’s surface. Clean effectively for a streak-free screen
- Gentle on your Screens - Our screen cleaner spray and wipes is compatible to be used even for the most sensitive LCD, LED, CRT, and OLED screens in proper use. Be at ease knowing that this product is compatible with all the major brands: LG, SONY, Samsung, Sharp, iPad, iPhone, Android screens, Kindle, PC monitors - we’ve got you covered! Can be used as LCD screen cleaner, tv cleaner, smart tv screen cleaner, and more
- Premium Super Soft Plush Microfiber Cloth - Included in this efficient screen cleaning kit. This screen cleaner spray and wipe has our signature plush microfiber cloth specially designed to comply with screens and monitors and leave them streak-free. Has been shown to effectively absorbs stubborn stains, zero streaks, and no fiber shedding. Always use this together with our screen cleaner for the best results
- Easy-to-Use Screen Cleaner Kit + microfiber cleaning cloth - The EVEO Screen Cleaning Kit will easily be your new favorite tool when it comes to taking care of the things you love most, quick and easy solution for a streak-free screen. Simply screw on the sprayer gun on the screen cleaner bottle. Spray the cleaning liquid onto the microfiber cloth, then wipe the screen until desired cleanliness & shine is achieved.
- Quality Screen Care Kit Worth Purchasing - Enjoy a convenient Screen Cleaner anytime, anywhere you need it. Your satisfaction is our top priority. We stand behind the quality of our products and that’s why, you shouldn’t be worrying at all. We manufacture the Best Screen Cleaner. and can be used for laptop cleaning kit, laptop screen cleaner, tv screen cleaner for smart tv. MacBook screen cleaner, monitor cleaner or screen cleaner spray for electronic devices with microfiber cleaning cloth
Duplicate module loading
Module php... already loaded means two configuration files attempt to load the same module. Keep one package-managed load and disable the manually added or duplicate entry. Loading the same module twice is not a harmless warning: it prevents a clean configuration and can stop Apache from starting.
Apache/PHP ABI mismatch
A module compiled for an incompatible Apache or PHP application binary interface cannot be repaired by changing its filename. Replace it with a module supplied for the installed distribution versions, or migrate the site to PHP-FPM where that is the distribution’s supported model. A successful package installation does not make an independently copied binary compatible.
Inspect the enabled configuration inventory
Debian and Ubuntu
List loaded modules with:
sudo apache2ctl -M
Then inspect the PHP enablement files:
ls -l /etc/apache2/mods-enabled/php*.load /etc/apache2/mods-enabled/php*.conf
The inventory should show one coherent PHP version and matching .load and .conf files. A file referring to a PHP version that is no longer installed is a strong indication of stale enablement. After correcting the package or removing the stale entry, rerun sudo apache2ctl configtest.
RHEL and Fedora
Inspect the Apache fragments in /etc/httpd/conf.d/ and /etc/httpd/conf.modules.d/, then inspect PHP-FPM’s main and pool configuration. The key files documented for RHEL 9 are:
/etc/httpd/conf/httpd.conf/etc/httpd/conf.d/php.conf/etc/php-fpm.conf/etc/php-fpm.d/www.conf
Look for a direct PHP module load left over from an older setup, a FastCGI proxy target that does not match the FPM pool, or a pool socket whose path and permissions disagree with Apache’s configuration.
Ubuntu and Debian: restore the package-managed module
Install the expected integration
Canonical’s Ubuntu Server procedure installs PHP and the Apache integration together:
Recommended Free Tools
sudo apt install php libapache2-mod-php
Use the package manager’s version for the distribution rather than copying a libphp file from another server. After installation, check that the versioned files under /etc/apache2/mods-enabled/ correspond to the installed package.
Test, then restart Apache
- Run
sudo apache2ctl configtestand require Syntax OK. - Restart with
sudo systemctl restart apache2.service. - Confirm the unit is active with
sudo systemctl status apache2 --no-pager -l.
If the restart still fails, return to the first fatal journal or ErrorLog line. Reinstalling the package repeatedly will not fix a port collision, a permissions error, or a duplicate custom configuration.
Rank #3
- 【Large size】:Measuring 800 x 300 mm/ 31. 5×12 inches, which is wider and taller than others. Large mouse pad can perfectly fit your keyboard and mouse of any size, and there is also ample space for peripherals such as phones, tablets, etc.
- 【LED backlight mouse pad】:Blade Hawks RGB mouse pad provides 7 static modes and 7 dynamic modes will give you the options you are looking for. Power-off memory function remembers the last lighting mode you selected. The super glow fiber Chroma will give you a colorful gaming setup that you want.
- 【Anti-slip rubber base】:Made from Natural rubber, this gaming mousepad will firmly grip your desktop, allowing you to enjoy the ultimate precision in the games you are most passionate about. It also comes with a texture that enhances this ability even further.
- 【Smooth and waterproof surface】: Micro-textured cloth surface, for extremely precise mouse control and a smooth movement. When liquid splashes on the gaming mouse pad, it forms water droplets and slides down. Will not delay your work or gameplay.
- 【Plug and play】: This mouse and keyboard pad is powered by USB, plug and play, no driver required. One button control light modes. Press one time to change the lighting mode, press twice to change the brightness, press and hold about 3 seconds turn ON/OFF.
RHEL 9: use PHP-FPM and FastCGI
Understand the default
RHEL 9 runs PHP through FastCGI Process Manager by default, and the mod_php module supplied for Apache has been removed. Apache and PHP therefore have separate services and separate failure points.
Start the services in the correct order
- Check the FPM configuration and service output with
sudo systemctl status php-fpm --no-pager -landsudo journalctl -u php-fpm -b --no-pager. - Start FPM and make sure it succeeds:
sudo systemctl start php-fpm. - Validate Apache:
sudo apachectl configtest. - Restart Apache:
sudo systemctl restart httpd. - Check both units with
sudo systemctl status php-fpm httpd --no-pager -l.
You can enable both services to start automatically with the system, but enabling them does not correct a bad pool, socket, or Apache proxy configuration. Fix the first FPM journal error before retrying httpd.
Check the FPM pool and socket
When php-fpm.service fails, inspect /etc/php-fpm.conf and /etc/php-fpm.d/www.conf. A pool may fail because of invalid syntax, a missing directory, a socket path that cannot be created, or permissions that prevent Apache from connecting. The Apache-side FastCGI mapping in /etc/httpd/conf.d/php.conf must point to the same working endpoint.
If syntax is valid but Apache still will not start
Resolve a port collision
An Unable to bind to Port ... message means Apache cannot claim a configured listener. Apache’s startup documentation identifies insufficient privilege and another Apache or web server already using the port as common causes. Find the owner with:
sudo ss -ltnp
Stop or reconfigure the conflicting service, or change the listener assignment deliberately. Then rerun configtest and retry the appropriate restart. Do not kill an unknown process merely because it owns the port; identify the service first.
Check permissions and dependencies
A valid syntax test does not prove that Apache can read every certificate, document-root directory, module, or runtime socket at startup. Use the first fatal journal and ErrorLog entry to identify the denied path or missing dependency. Correct ownership, mode, directory traversal, package installation, or service ordering at that specific location, then test again.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Scan for outdated or missing drivers - takes under a minute3Repair Windows errors before they cause bigger problemsSeparate Apache failure from FPM failure
On RHEL, Apache can have valid syntax while PHP-FPM is stopped or unhealthy. Conversely, FPM can be healthy while Apache’s FastCGI mapping points to the wrong socket. Check each unit independently and confirm that the endpoint named by Apache exists and is accessible to the web-server process.
Match the failure signature to the next check
Once the first fatal line is isolated, use it to choose one focused action instead of changing several files at once.
Rank #4
- 【Softer and More Comfortable】Vaydeer wrist rest has unique diamond pattern, which is the combination of softness and aesthetics. The materials of wrist rest are improved into higher quality memory foam and covered with silky smooth lycra. The computer wrist rest makes you as comfortable and cushiony as like rest your wrists on clouds.
- 【Ergonomic Wrist Saver】The wrist rests for keyboard and mouse comes with a 17.32×3.15×0.83 inch keyboard wrist pad and a 5.94×3.15×0.83 inch mouse wrist support. Based on ergonomic design, the unique concave shape is the perfect fit for your wrist joints. The wrist rest pad fits most computer keyboards and laptops, improve hand and wrist posture, release your wrist and arm stress.
- 【Non-Slip Rubber Bottom】Featuring an anti-skid silicone base on the bottom, this wrist keyboard support stays firmly in place on your desk, preventing the padding from sliding around, ensuring stable and consistent wrist support during extended computer sessions.
- 【Better Experience & Pain Relief】Our keyboard arm rest is beneficial to alleviate the soreness caused by direct contact and friction between your arm and a hard desk surface, reducing the risk of wrist fatigue or carpal tunnel. The soft texture of memory foam can evenly distribute the pressure around your wrists and provide good support with just enough give.
- 【Helpful in Multiple Scenarios】Whether you're working, studying, writing, typing, gaming, this keyboard and mouse rest combo is an essential accessory to add comfort and support to your hands and wrists. It’s also a great gift for men, women, family, friend, coworker, gamer, teacher, etc.
| Message or symptom | Most likely area | Next action |
|---|---|---|
Syntax error on line ... |
Apache or PHP configuration | Open the named file and line, correct or remove the invalid directive, and rerun configtest. |
Cannot load ... libphp*.so |
Stale, missing, or incompatible PHP module | Install the matching distribution integration, remove stale versioned enablement, and do not guess a replacement path. |
Module php... already loaded |
Duplicate module configuration | Keep one package-managed load and disable the manual duplicate. |
Unable to bind to Port ... |
Another process owns the listener or Apache lacks the required privilege | Run sudo ss -ltnp, identify the owner, and stop or reconfigure the conflicting service. |
php-fpm.service failed |
FPM syntax, socket, permission, or dependency problem | Read systemctl status php-fpm and journalctl -u php-fpm -b; fix the first reported error before restarting httpd. |
| Restart succeeds but PHP downloads or displays source | Handler or FastCGI mapping is not active | Confirm the Debian/Ubuntu module or the RHEL FPM proxy configuration, then make an HTTP test request. |
The final systemd line is often only a consequence. For example, Job for apache2.service failed because the control process exited with error code does not identify whether the cause was a malformed directive, a missing shared object, or a port already in use. The preceding Apache or journal message does.
Do not mix fixes from different integration models
Commands that enable an Apache module on Ubuntu do not convert RHEL 9 to a supported mod_php setup. Likewise, copying an FPM pool file into Debian’s module directory does not create a working handler. First identify the service name and configuration layout, then use the matching package-managed integration.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallOutdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware match- On Debian or Ubuntu, investigate
/etc/apache2/mods-enabled/, thelibapache2-mod-phppackage, and the output ofapache2ctl -M. - On RHEL 9, investigate
httpd,php-fpm, the files under/etc/httpd/conf.d/, and the FPM pool under/etc/php-fpm.d/. - Do not add a second PHP module simply because an old tutorial shows a different version. Two loads can create the duplicate-module error, while an old binary can create a missing-file or ABI error.
When Apache starts but PHP still does not execute
PHP files download or display source
If a browser downloads a .php file or displays its source, Apache is serving the file without an active PHP handler. On Debian or Ubuntu, verify that the expected PHP module appears in sudo apache2ctl -M and that the matching files exist in /etc/apache2/mods-enabled/. On RHEL, verify the PHP-FPM service and FastCGI mapping rather than trying to load a removed mod_php module.
PHP requests return an error after FPM starts
Check the FPM journal, pool socket or endpoint, and the Apache ErrorLog. A service that is running is not necessarily reachable: socket ownership, permissions, and a mismatch between www.conf and php.conf can still prevent request handling.
Verify the repair over HTTP, then remove diagnostics
A successful systemd restart proves only that the services started. Verify the complete request path with a temporary page in the Apache DocumentRoot. On a typical Ubuntu server, create /var/www/html/phpinfo.php containing:
<?php phpinfo(); ?>
- Request the page locally or through the site’s normal HTTP endpoint.
- Confirm that the page renders as PHP rather than downloading source or returning a server error.
- Check the reported PHP version and SAPI. The SAPI should match the integration you intended: Apache’s PHP module on a Debian or Ubuntu module setup, or FPM/FastCGI on RHEL 9.
- Delete the file immediately:
sudo rm /var/www/html/phpinfo.php.
The page exposes extensive server and PHP configuration, so leaving it accessible creates unnecessary information disclosure. If the page fails, use its HTTP status together with the Apache ErrorLog and, on RHEL, the PHP-FPM journal to locate the remaining handler problem.
Use a controlled retry
After each change, make the smallest possible verification: run the relevant syntax test, inspect the exact output, and only then restart one service. This preserves a clear cause-and-effect trail. If several old PHP files are present, do not delete every configuration fragment indiscriminately; identify which file is named by configtest or the journal and remove only the stale or duplicate reference.
When an upgrade leaves both an old and new versioned file enabled, the desired end state is one coherent, package-managed integration. On Ubuntu or Debian that means matching .load and .conf files for the installed module. On RHEL it means a working FPM pool and an Apache FastCGI mapping that points to the same socket or endpoint. Recheck the complete inventory after the repair so the next package operation does not revive the obsolete entry.
Best Value
- 【No Drill Mounted】Cable management tray can be assembled in as little as 3 minutes or less-simply. Side clips easily clampe the edge of desk, pass through the holes on the sides, and secure excess cables with baskets. Desk cable management supports inward or outward installation to meet your needs in different scenarios, and provides you with great convenience when collecting and organizing wires.
- 【Rubber Pad Protects Desk】Wire organizer under desk built-in soft rubber pads on the clamp protect your desk from scratches, so you will not damage your furniture or office.
- 【Sturdy and Beautiful】Cord management under desk is made of high-quality carbon steel and holds about 15 lbs. The wire basket has 2 holes on each side of the tray to enable your cables to pass freely. Cable baskets are suitable for desk thickness use from 0.4" to 2.4".
- 【Space Saving & Keep Organized】Desk cable management tray holds all your power cords, outlet strips, USB hubs and computer transformers hidden from your feet, and the data cables will not enter the vacuum cleaner to keep your desk clean and tidy. Desk wire organizer is also suitable for use in the kitchen and outdoors.
- 【Reduce Safety Risks】Cable tray under desk keeps all plugs away from your kids, no more worry about tripping. Using 2 holes wire tray saves extra space, helps you easily cabling and wire protection. The mesh design is not easy to accumulate dust, but avoids safety accidents caused by messy wires.
Prevent the next PHP upgrade from breaking Apache
- Record the distribution and service names before applying package changes: Debian or Ubuntu uses
apache2; RHEL useshttpdand commonlyphp-fpm. - Use the distribution’s integration package or FPM configuration instead of copying a versioned shared object between hosts.
- After every PHP or Apache change, run the correct
configtestbefore restarting. - Keep one authoritative module load. Remove manually copied or duplicate
LoadModuleentries when the package supplies the same integration. - When a test names a file and line, fix that first error rather than changing several unrelated files at once.
- Keep the service journal and Apache ErrorLog available during the restart so the first fatal message is not lost among repeated attempts.
- After startup, make one real HTTP request and confirm the expected PHP version and SAPI, then remove any diagnostic page.
Frequently Asked Questions
Why does Apache say the control process exited with an error code?
That systemd message is generic. Run sudo apache2ctl configtest on Debian or Ubuntu, or sudo apachectl configtest on RHEL-family systems, then read the first specific error in the Apache journal or ErrorLog.
Should I run apachectl or apache2ctl?
Use apache2ctl for Debian and Ubuntu. Use apachectl for RHEL, Fedora, and source installations. A successful test prints Syntax OK.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Can I enable mod_php on RHEL 9 to fix the restart?
No. RHEL 9 removed the supplied mod_php module and runs PHP through PHP-FPM and FastCGI by default. Check php-fpm, its pool configuration, and the Apache FastCGI mapping instead.
What causes a Cannot load libphp error?
Apache is pointing to a shared object that is missing, stale, moved, or incompatible. Install the matching distribution integration package and remove the old versioned or manually copied LoadModule reference rather than guessing a filename.
How do I fix Module php already loaded?
Find the duplicate entries in the enabled Apache configuration, keep one package-managed module load, disable the manual duplicate, and rerun configtest.
What should I do when Apache reports Unable to bind to Port?
Run sudo ss -ltnp to identify the process using the listener. Stop or reconfigure the confirmed conflicting service, then run configtest and retry Apache. Do not terminate an unknown process solely because it owns the port.
Why can Apache be healthy while PHP requests fail on RHEL?
Apache and PHP-FPM are separate services. Apache may have valid syntax while FPM is stopped, its pool is invalid, its socket has the wrong permissions, or php.conf points to a different endpoint. Check both units and their logs.
Is it safe to leave phpinfo.php on the server?
No. A phpinfo() page reveals extensive PHP and server settings. Use it only long enough to confirm the PHP version and SAPI, then remove it with sudo rm /var/www/html/phpinfo.php.
The Bottom Line
Run the platform-appropriate configtest first and fix the exact file or line it reports. Debian and Ubuntu usually load PHP through libapache2-mod-php; RHEL 9 uses PHP-FPM and FastCGI. If syntax is clean, inspect the first journal or ErrorLog failure for ports, permissions, sockets, and dependencies. Restart only after the test passes, verify a real PHP request, and remove the diagnostic page.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →

