I'm not sure what libraries are available in PHP for interacting with ethereum but you could start by using the json RPC interface on an ethereum node.
Since most ERC20 tokens have events that are triggered for allocations and transfers you can query the node using eth_getLogs to get information about how the sell is progressing and also look at the balance of the contract itself. Specifically for users to view their token allocations - this can be done client side with web3js and calling an ERC20 function called balanceOf (which is only a call
not a sendTransaction
. You don't even have to host the node in this case, you can use INFURA as a provider.
Honestly most of this can be done client side with web3js and the contract ABI but I find the user experience better if you store and update the progress you get from eth_getLogs server side in a cache and present it to users on page load. Bonus points if you open a websocket and update that information to users as the sale progresses.