Getting Xdebug, Xampp and Netbeans to work together in Windows can be a tricky thing and I want to address that here. These instructions will get debugging working all on the same PC and IP.
A symptom of a PC that is not setup correctly is this Netbeans Socket Exception error. You get this error when Netbeans cannot communicate with Xdebug and is usually because you are running them both on the same computer and therefore IP so the traffic routing is getting mixed up. It could also because something else is running on the debug port you have selected.

xdebug.var_display_max_data=16384 // Source - https://stackoverflow.com/a/40608738 // Posted by matt // Retrieved 2026-05-06, License - CC BY-SA 3.0 netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true -J-Dnb.php.debugger.full.values=true"
Options -> PHP -> Debugging tab in netbeans and set Maximum Data Length to a large number like 100000 (I think -1 should also work here).xdebug.var_display_max_data to -1 seems to have fixed the problem. Hope this helps someone else.These settings are what I am using now and work well.
output_buffering = Off
[XDebug] zend_extension="D:\websites\php\ext\php_xdebug.dll" ;zend_extension="D:\websites\php\ext\php_xdebug-2.5.4-5.6-vc11.dll" xdebug.idekey = netbeans-xdebug xdebug.profiler_append = 0 xdebug.profiler_enable = 0 xdebug.profiler_enable_trigger = 0 xdebug.profiler_output_dir = "d:\websites\tmp\xdebug" xdebug.profiler_output_name = "cachegrind.out.%t-%s" xdebug.remote_enable = 1 xdebug.remote_autostart = 0 xdebug.remote_connect_back = 0 xdebug.remote_host = "192.168.1.160" xdebug.remote_port = 9001 xdebug.remote_handler = "dbgp" xdebug.remote_mode = req xdebug.remote_log = "d:\websites\tmp\xdebug\xdebug_remote.log" xdebug.show_local_vars = 9 xdebug.trace_output_dir = "d:\websites\tmp" ;xdebug.show_exception_trace = 1
Minimum working settings
These are the minimum settings I have found to work but are here only for reference.
[XDebug] ;zend_extension="D:\websites\php\ext\php_xdebug.dll" zend_extension="D:\websites\php\ext\php_xdebug-2.5.4-5.6-vc11.dll" xdebug.remote_enable=1 xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.remote_host=192.168.1.160 xdebug.remote_port=9001 xdebug.idekey=netbeans-xdebug
(Tools --> Options --> PHP --> Debugging)
You need to send a trigger to Xdebug via your browser to trigger the debugger. You can send the trigger via GET/POST but you need a plugin for this.
### Example Server Path: D:\websites\htdocs\platforms\Joomla4 Project Path: D:\websites\htdocs\platforms\Joomla4

Now you have configured your system as above you need to test it before you can rely on it.
If xdebug does not work straight away then trying these things might help.
This code is taken from 21.4.2 How to Set Up XDebug | Oracle
<?php $address = '127.0.0.1'; $port = '9000'; $sock = socket_create(AF_INET, SOCK_STREAM, 0); socket_bind($sock, $address, $port) or die(); socket_listen($sock); $client = socket_accept($sock); echo "Connection established: $client"; socket_close($client); socket_close($sock); ?>
However I found this slightly better version from dbgtest.php · GitHub
<?php // adapted from https://blogs.oracle.com/netbeansphp/entry/howto_check_xdebug_installation $address = $argv[1] ?: '127.0.0.1'; $port = '9000'; $sock = socket_create(AF_INET, SOCK_STREAM, 0); socket_bind($sock, $address, $port) or die(); echo "Listening to $address:$port\n"; socket_listen($sock); $client = socket_accept($sock); echo "Connection established: $client\n"; socket_close($client); socket_close($sock);
Call to undefined function socket_create()
If there is something running on this socket you will get an error as shown below. This shows that some other process is using the port 9000.
Warning: socket_bind(): unable to bind address [10048]: Only one usage of each socket address (protocol/network address/port) is normally permitted. in D:\websites\htdocs\dbgtest.php on line 5
These are a few workarounds I tried and might work for you. These are not designed to be a permanent fix.
Method 1
* I am not sure if you need to do the IP fix aswell for this to work. It is all caused by routing issues on the loopback system of the PC. Or sockets might be needed.
Method 2
Method 3 - (if working and then stops for no reason)
This is so when you get parsing errors and Xdebug shows those errors in the browser, you can click on the link to open up Netbeans at the appropriate file and line number.
These files are required to make this function work.
netbeans.bat
:: Useful Sites :: https://quantumwarp.com/kb/articles/72-xampp/928-debugging-with-netbeans-xdebug-and-xampp-in-windows :: https://xdebug.org/docs/all_settings#file_link_format :: Disable onscreen text @echo off :: This allows variable replacements :: Cause each variable to be expanded at execution time rather than at parse time. :: https://quantumwarp.com/kb/articles/10-windows-family/988-replace-a-text-string-in-a-windows-batch-file :: https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/setlocal setlocal EnableExtensions EnableDelayedExpansion :: Replace netbeans:// with the full program path set NETBEANS=%1 :: This holds the open command defined in xdebug/xampp set FILE=%~2 :: Convert '%5C' --> '\' :: This requires EnableDelayedExpansion :: We use the !! because of the % special character :: Cycles once but does not parse variables and only removes one of the percent signs :: You can use ENDLOCAL to stop this looping, but we dont need to SET FILE=!FILE:%%5C=\! :: the ~19 appends the page number on. This just assumes there are 18 or less other variables %NETBEANS% --nosplash --console suppress --open "%FILE:~19%" :: `nircmd` is a utility that does various computer related commands :: nircmd win activate process netbeans.exe :: Dont Close the Window after running - useful for debugging :: cmd /k
netbeans_protocol.reg
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\netbeans] "URL Protocol"="" @="URL:Netbeans Protocol" [HKEY_CLASSES_ROOT\netbeans\DefaultIcon] @="\"C:\\Program Files\\NetBeans-12.6\\netbeans\\bin\\netbeans64.exe,1\"" [HKEY_CLASSES_ROOT\netbeans\shell] [HKEY_CLASSES_ROOT\netbeans\shell\open] [HKEY_CLASSES_ROOT\netbeans\shell\open\command] @="\"C:\\Windows\\netbeans.bat\" \"C:\\Program Files\\NetBeans-12.6\\netbeans\\bin\\netbeans64.exe\" \"%1\""
netbeans.bat to open Netbeans.netbeans.bat is executed.netbeans.bat batch file in C:\Windows
PATH.netbeans_protocol.reg to your current version of Netbeans and make sure you select the correct 32/64-bit executable.
ie: "C:\Program Files\NetBeans-12.6\netbeans\bin\netbeans64.exe"
netbeans_protocol.reg to apply to the registryphp.ini, configure or set the following: xdebug.file_link_format = "netbeans://open/?f=%f:%l"\NetBeans\harness\etc\app.conf
default_options="-J-Xms24m -J-Xmx1024m"
Links
opening this file could cause outofmemoryerror netbeans
default_options="-J-Xms24m -J-Xmx1024m"
C:\Program Files\NetBeans-11.1\netbeans\etc\netbeans.conf C:\Program Files\NetBeans-11.1\netbeans\harness\etc\app.conf
app.conf and netbeans.conf seem to be the same. I would recommend editing the netbeans.conf as this is where there are some default options already set-J-Xss2m
-Xss Set the maximum stack size for Java threads.
'-J-Dorg.openide.text.big.file.size=5' --> will set the large file size to 5MB - This is a system property. should not matter beginning or end, but does work at endwarnedFiles - Holds the files the user has already accepted, where is this list? add this to my article, someone might answer. i cant.
xdebug.remote_autostart = Onxdebug.remote_autostart = OffThis code is incredibly useful for going through an array and applying changes to the individual values without having to create a specific loop to perfom this action. In this example all apostrophes are escaped.
// Walk through the array and escape all apostophes (anonymous function)
array_walk($merged_config, function(&$value, &$key) {
$value = str_replace("'", "\\'", $value);
});
this also works, without the &$key
// Walk through the array and escape all apostophes (anonymous function)
array_walk($merged_config, function(&$value) {
$value = str_replace("'", "\\'", $value);
});
keep the '&' it is important. This creates a reference to the object in memory.
When testing the translation system on QWcrm I needed to try different locales (languages) to see if the software actually worked how it should. The following are ways to change the HTTP_ACCEPT_LANGUAGE header that the browser sends to the webhost with its request.
This will also fix the issue where Firefox was sending en-US instead of en-GB
Option 1 - Change the browser system settings
Option 2 - re install
You can also just install Firefox with the correct locale.
Option 3 - Plugins
Using a plugin will allow you to easily change the settings on a temporary basis.
Option 1 - Change the browser system settings
This is useful when you want to control the errors outputted tot he screen or is a class or some other code is not behaving as expected, such as the ADOdb error class.
The following code will preserve the current error reporting level so once your code has finished running the system's error reporting will be returned to its normal state.
// Get current PHP error reporting level $reporting_level = error_reporting(); // Disable PHP error reporting (works globally) error_reporting(0); // Add you code here // Re-Enable PHP error reporting error_reporting($reporting_level);
This needs to be cleared up for us newbies. and to start with you will come across the following statements which are both true.
Composer is not a package manager because you are not downloading complete software packages but dependencies/libraries for your own software package.
Composer is a cross-platform software package that can is used to manage libraries for your PHP software project allowing you to install, update and remove libraries/dependencies from a single point reducing the need to manually update all of the dependecies individually which reduces time and makes it easier to keep things upto date. composer calls on its own library to get the latest updates of the various depencies. A vendor of software can make their software available from this library for others to use.
It is composer of the program mentioned above to manage your dependecies and also a small library to control autoloading of classes and other things.
Composer is useful because some packages use mulitple dependancies to get them to work and composer allows you to always get the latest version of all of the packages, or specify package numbers for your project. This process also correctly sets up all the required includes up as needed. This can reduce the time needed to update all of the packages.
The Wonderful World of Composer - YouTube - This is brilliant video that will explain Composer completely.
require vendor/autoload.php
When using mPDF to generate a PDF from a template it renders one or more tables and the fonts within them smaller than what they are in the template.
Look at the code below:
<!-- Invoice details -->
<td valign="top" align="right" width="200">
<table border="0" cellpadding="3" cellspacing="0" style="border-collapse: collapse;">
<tr>
<td valign="top" width="90%" align="right"></td>
<td align="top" class="olotd5" width="200">
<table width="180" border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse;">
<tr>
<td>
<b>{t}Invoice ID{/t} - </b>{$invoice_details.invoice_id}<br>
<b>{t}Status{/t} - </b>{$workorder_details.status}<br>
<b>{t}Date{/t} - </b>{$invoice_details.date|date_format:$date_format} <br>
<b>{t}Due Date{/t} - </b>{$invoice_details.due_date|date_format:$date_format}<br>
<b>{t}Work Order{/t} - </b>{$invoice_details.workorder_id}<br>
<b>{t}Technician{/t} - </b>{$employee_details.display_name}<br>
<b>{t}Credit Terms{/t} - </b>{$customer_details.credit_terms}<br>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
and you can see this line.
<td valign="top" width="90%" align="right"></td>
mPDF cannot handle this empty cells with sizing statements.
I removed this line and then the template was rendered correctly.
These are some notes I made while integrating dhtmlxCombo into QWcrm.
<script src="/{$theme_js_dir}dhtmlxcombo/dhtmlxcombo.js"></script>
<link rel="stylesheet" href="/{$theme_js_dir}dhtmlxcombo/fonts/font_roboto/roboto.css"/>
<link rel="stylesheet" href="/{$theme_js_dir}dhtmlxcombo/dhtmlxcombo.css">
Example code I used in QWcrm
// This Call Transforms the Select Element by ID to a real Combo Box
var combo = dhtmlXComboFromSelect('description['+ iteration+']');
// This Call Transforms the Select Element by ID to a real Combo Box
var combo = dhtmlXComboFromSelect('rate['+ iteration+']');
var combo = dhtmlXComboFromSelect('rate['+ iteration+']');
combo.setSize(90); // This sets the width of the combo box and drop down options width
//combo.setOptionWidth(200); // this sets the width of the options drop down ONLY
These are my note for Keep a Changelog
Version Number Links
The links on the version number [1.0.0] will not work unless they have the corresponding link below i.e.
[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v1.0.0...HEAD [1.0.0]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.3.0...v1.0.0 [0.3.0]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.2.0...v0.3.0
Option 1
This is an example blockquote.
<div style="text-align: center;">
<blockquote style="display: inline-block; width: 200px;">This is an example blockquote.</blockquote>
</div>
Option 2
This is an example blockquote.
<div style="text-align: center;">
<blockquote style="display: inline-block; max-width: 450px;">
<p>This is an example blockquote.</p>
</blockquote>
</div>
Option 3
This is an example blockquote.
<blockquote style="display: table; max-width: 450px; margin: 0 auto;">This is an example blockquote.</blockquote>
These width settings work aswell: